androi自訂自動換行的View(類似網頁的標籤Tag),androitag

來源:互聯網
上載者:User

androi自訂自動換行的View(類似網頁的標籤Tag),androitag

看來只有礼拜天才有時間寫點部落格啊,平時只能埋頭苦幹了。今天在公司加班,遇到一個需求,就是自動換行的TextView,有點像網頁的tag標籤,點擊一下,就自動加上去了,不過這個是根據後台拿來的資料來顯示多少個View,在網上找找,看見了許多,我自己也封裝寫一個吧,以便以後需要...開工

package com.woyou.ui.component;import android.content.Context;import android.util.AttributeSet;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;import com.citaq.ideliver.R;/** * 自動換行的View *  * @author shenzhou2015年1月11日 */public class WordWrapView extends ViewGroup {private static final int PADDING_HOR = 10;// 水平方向paddingprivate static final int PADDING_VERTICAL = 15;// 垂直方向paddingprivate static final int SIDE_MARGIN = 10;// 左右間距private static final int TEXT_MARGIN = 10;public WordWrapView(Context context) {super(context);}public WordWrapView(Context context, AttributeSet attrs) {super(context, attrs);}public WordWrapView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);}@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {int childCount = getChildCount();int autualWidth = r - l;int x = SIDE_MARGIN;// 橫座標開始int y = 0;// 縱座標開始int rows = 1;for (int i = 0; i < childCount; i++) {View view = getChildAt(i);view.setBackgroundResource(R.drawable.shopdetail_keytag_bg);int width = view.getMeasuredWidth();int height = view.getMeasuredHeight();x += width + TEXT_MARGIN;if (x > autualWidth) {x = width + SIDE_MARGIN;rows++;}y = rows * (height + TEXT_MARGIN);if (i == 0) {view.layout(x - width - TEXT_MARGIN, y - height, x- TEXT_MARGIN, y);} else {view.layout(x - width, y - height, x, y);}}}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int x = 0;// 橫座標int y = 0;// 縱座標int rows = 1;// 總行數int specWidth = MeasureSpec.getSize(widthMeasureSpec);int actualWidth = specWidth - SIDE_MARGIN * 2;// 實際寬度int childCount = getChildCount();for (int index = 0; index < childCount; index++) {View child = (TextView) getChildAt(index);child.setPadding(PADDING_HOR, PADDING_VERTICAL, PADDING_HOR,PADDING_VERTICAL);child.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);int width = child.getMeasuredWidth();int height = child.getMeasuredHeight();x += width + TEXT_MARGIN;if (x > actualWidth) {// 換行x = width;rows++;}y = rows * (height + TEXT_MARGIN);}setMeasuredDimension(actualWidth, y);}}
具體使用:

我的項目的布局檔案太長了,我就說了

<com.woyou.ui.component.WordWrapView               style="@style/shopDetailTextStyle"               android:id="@+id/shopdetail_container"               android:layout_width="match_parent"               android:layout_height="wrap_content"               android:orientation="vertical"               android:paddingLeft="@dimen/dp20"               android:paddingRight="@dimen/dp20"               android:paddingTop="@dimen/dp10" />
把這段布局檔案加到你要把文字自動換行的地方。java檔案中的使用:

if ( !TextUtils.isEmpty(shopDetail.getInfo()) ) {infoLin.setVisibility(View.VISIBLE);//店鋪關鍵字String key = shopDetail.getKey();strs = key.split("\\|");for (int i = 0; i < strs.length; i++) {      TextView textview = new TextView(mActivity);      textview.setText(strs[i]);      wordWrapView.addView(textview);}LogUtil.i(TAG, "tags:" + strs.toString());
前面還有找到控制項什麼的,我相信大家都是知道的。這隻是核心代碼,如下:



****************************************************************************************************************************

**********************介紹另外一種方法,是某個大神寫的,不過沒封裝,供大家參考***********************************

****************************************************************************************************************************

 /** 標籤之間的間距 px */      private final int itemMargins = (int) getContext().getResources().getDimension(R.dimen.dp15);      /** 標籤的行間距 px */      private final int lineMargins = (int) getContext().getResources().getDimension(R.dimen.dp10);  
/** * 載入店鋪關鍵字 * @param tags */private void loadShopKeys (String[] tags) {if ( tags == null )return;final int containerWidth = container.getMeasuredWidth() - container.getPaddingRight()  - container.getPaddingLeft();          final LayoutInflater inflater = mActivity.getLayoutInflater();          /** 用來測量字元的寬度 */          final Paint paint = new Paint();          final TextView textView = (TextView) inflater.inflate(R.layout.item_textviewtag_lv, null);          final int itemPadding = textView.getCompoundPaddingLeft() + textView.getCompoundPaddingRight();          final LinearLayout.LayoutParams tvParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,  LayoutParams.WRAP_CONTENT);          tvParams.setMargins(0, 0, itemMargins, 0);          paint.setTextSize(textView.getTextSize());          LinearLayout layout = new LinearLayout(getContext());          layout.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));          layout.setOrientation(LinearLayout.HORIZONTAL);          container.addView(layout);          final LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);          params.setMargins(0, lineMargins, 0, 0);          /** 一行剩下的空間 **/          int remainWidth = containerWidth;          for (int i = 0; i < tags.length; ++i) {              final String text = tags[i];              final float itemWidth = paint.measureText(text) + itemPadding;              if (remainWidth > itemWidth) {                  addItemView(inflater, layout, tvParams, text);              } else {                  resetTextViewMarginsRight(layout);                  layout = new LinearLayout(getContext());                  layout.setLayoutParams(params);                  layout.setOrientation(LinearLayout.HORIZONTAL);                  /** 將前面那一個textview加入新的一行 */                  addItemView(inflater, layout, tvParams, text);                  container.addView(layout);                  remainWidth = containerWidth;              }              remainWidth = (int) (remainWidth - itemWidth + 0.5f) - itemMargins;          }          resetTextViewMarginsRight(layout);      }  /***************** 將每行最後一個textview的MarginsRight去掉 *********************************/      private void resetTextViewMarginsRight(ViewGroup viewGroup) {          final TextView tempTx = (TextView) viewGroup.getChildAt(viewGroup.getChildCount() - 1);          tempTx.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));      }        private void addItemView(LayoutInflater inflater, ViewGroup viewGroup, android.widget.LinearLayout.LayoutParams tvParams, String text) {          final TextView itemTx = (TextView) inflater.inflate(R.layout.item_textviewtag_lv, null);          itemTx.setText(text);          viewGroup.addView(itemTx, tvParams);      }  
好了,到此結束了,屌絲要繼續加班了,話說都好幾天沒打LoL,有點懷念了,等這段時間過了,本吊要擼到天明...



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.