1. 程式人生 > >安卓中使用流式佈局實現標籤

安卓中使用流式佈局實現標籤

我們在開發的時候通常需要加標籤,對於這個標籤怎麼說呢,反正也挺複雜的,最初開發這個標籤的時候還是沒有思路的,後來在github上面查找了一下資料,瞭解了通過流式佈局來實現這個標籤,我記得開始的時候我寫標籤的時候是三個TextView一個一個新增進去的,後來感覺還是不太好,所以咯就用了流式佈局來實現。看一下我的思路。第一步我在github上面找流式佈局實現標籤功能,找到了一個工具類感覺灰常好用所以就用了,看一下他的工具類

package com.redsun.property.widgets;
import android.content.Context;
import android.content.res.TypedArray;
import android.database.DataSetObserver; import android.graphics.Canvas; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import com.redsun.property.R; /** * <Pre> * 元素自動換行容器 * </Pre> * * @author zhangy * @version
1.0 * <p> * Create by 14/11/12 下午6:22 */ public class TagCloudLayout extends ViewGroup { private int mLineSpacing; private int mTagSpacing; private BaseAdapter mAdapter; private TagItemClickListener mListener; private DataChangeObserver mObserver; public TagCloudLayout(Context context) { super
(context); init(context, null, 0); } public TagCloudLayout(Context context, AttributeSet attrs) { super(context, attrs); init(context, attrs, 0); } public TagCloudLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(context, attrs, defStyle); } private void init(Context context, AttributeSet attrs, int defStyle) { TagCloudConfiguration config = new TagCloudConfiguration(context, attrs); mLineSpacing = config.getLineSpacing(); mTagSpacing = config.getTagSpacing(); } private void drawLayout() { if (mAdapter == null || mAdapter.getCount() == 0) { return; } this.removeAllViews(); for (int i = 0; i < mAdapter.getCount(); i++) { View view = mAdapter.getView(i,null,null); final int position = i; view.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (mListener != null) { mListener.itemClick(position); } } }); this.addView(view); } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int wantHeight = 0; int wantWidth = resolveSize(0, widthMeasureSpec); int paddingLeft = getPaddingLeft(); int paddingRight = getPaddingRight(); int paddingTop = getPaddingTop(); int paddingBottom = getPaddingBottom(); int childLeft = paddingLeft; int childTop = paddingTop; int lineHeight = 0; //TODO 固定列的數量所需要的程式碼 for (int i = 0; i < getChildCount(); i++) { final View childView = getChildAt(i); LayoutParams params = childView.getLayoutParams(); childView.measure( getChildMeasureSpec(widthMeasureSpec, paddingLeft + paddingRight, params.width), getChildMeasureSpec(heightMeasureSpec, paddingTop + paddingBottom, params.height) ); int childHeight = childView.getMeasuredHeight(); int childWidth = childView.getMeasuredWidth(); lineHeight = Math.max(childHeight, lineHeight); if (childLeft + childWidth + paddingRight > wantWidth) { childLeft = paddingLeft; childTop += mLineSpacing + childHeight; lineHeight = childHeight; } childLeft += childWidth + mTagSpacing; } wantHeight += childTop + lineHeight + paddingBottom; setMeasuredDimension(wantWidth, resolveSize(wantHeight, heightMeasureSpec)); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { //TODO 固定列的數量所需要的程式碼 int width = r - l; int paddingLeft = getPaddingLeft(); int paddingTop = getPaddingTop(); int paddingRight = getPaddingRight(); int childLeft = paddingLeft; int childTop = paddingTop; int lineHeight = 0; for (int i = 0; i < getChildCount(); i++) { final View childView = getChildAt(i); if (childView.getVisibility() == View.GONE) { continue; } int childWidth = childView.getMeasuredWidth(); int childHeight = childView.getMeasuredHeight(); lineHeight = Math.max(childHeight, lineHeight); if (childLeft + childWidth + paddingRight > width) { childLeft = paddingLeft; childTop += mLineSpacing + lineHeight; lineHeight = childHeight; } childView.layout(childLeft, childTop, childLeft + childWidth, childTop + childHeight); childLeft += childWidth + mTagSpacing; } } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); } @Override public LayoutParams generateLayoutParams(AttributeSet attrs) { return new LayoutParams(this.getContext(), attrs); } public void setAdapter(BaseAdapter adapter){ if (mAdapter == null){ mAdapter = adapter; if (mObserver == null){ mObserver = new DataChangeObserver(); mAdapter.registerDataSetObserver(mObserver); } drawLayout(); } } public void setItemClickListener(TagItemClickListener mListener) { this.mListener = mListener; } public interface TagItemClickListener { void itemClick(int position); } class DataChangeObserver extends DataSetObserver { @Override public void onChanged() { TagCloudLayout.this.drawLayout(); } @Override public void onInvalidated() { super.onInvalidated(); } } public class TagCloudConfiguration { private static final int DEFAULT_LINE_SPACING = 5; private static final int DEFAULT_TAG_SPACING = 10; private static final int DEFAULT_FIXED_COLUMN_SIZE = 3; //預設列數 private int lineSpacing; private int tagSpacing; private int columnSize; private boolean isFixed; public TagCloudConfiguration(Context context,AttributeSet attrs){ TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TagCloudLayout); try { lineSpacing = a.getDimensionPixelSize(R.styleable.TagCloudLayout_lineSpacing, DEFAULT_LINE_SPACING); tagSpacing = a.getDimensionPixelSize(R.styleable.TagCloudLayout_tagSpacing, DEFAULT_TAG_SPACING); columnSize = a.getInteger(R.styleable.TagCloudLayout_columnSize, DEFAULT_FIXED_COLUMN_SIZE); isFixed = a.getBoolean(R.styleable.TagCloudLayout_isFixed,false); } finally { a.recycle(); } } public int getLineSpacing() { return lineSpacing; } public void setLineSpacing(int lineSpacing) { this.lineSpacing = lineSpacing; } public int getTagSpacing() { return tagSpacing; } public void setTagSpacing(int tagSpacing) { this.tagSpacing = tagSpacing; } public int getColumnSize() { return columnSize; } public void setColumnSize(int columnSize) { this.columnSize = columnSize; } public boolean isFixed() { return isFixed; } public void setIsFixed(boolean isFixed) { this.isFixed = isFixed; } } }
他的方法已經封裝好了 所以我就直接用了,因為有時候開發就是知道怎麼用網上的demo,咱們保證可以run起來就可以了,在微調微調。
<com.redsun.property.widgets.TagCloudLayout
android:id="@+id/area_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="@dimen/spacing_small"
android:layout_marginRight="@dimen/spacing_small"
>
</com.redsun.property.widgets.TagCloudLayout>
這麼用它的這個工具類,
holder.areaLayout.removeAllViews();
if (butlerEntity.getArealist() != null && butlerEntity.getArealist().size() > 0) {
    for (ButlerEntity.Area area : butlerEntity.getArealist()) {
        TextView text = new TextView(mct);
ViewGroup.MarginLayoutParams lp = new ViewGroup.MarginLayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
text.setTextColor(mct.getResources().getColor(R.color.butler_area_textcolor));
text.setBackground(mct.getResources().getDrawable(R.drawable.bg_bulter_text));
text.setText(area.getAreaname());
lp.setMargins(140, 20, 140, 20);
holder.areaLayout.addView(text, lp);
}
} else {
    TextView text = new TextView(mct);
ViewGroup.MarginLayoutParams lp = new ViewGroup.MarginLayoutParams(
            ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
text.setText("暫無片區");
holder.areaLayout.addView(text, lp);
}

return convertView;
之後就這樣實現了它的功能這裡需要注意一下
ViewGroup.MarginLayoutParams lp = new ViewGroup.MarginLayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
這個方法比不可少,否則就會報型別轉換異常改工嗯呢該就實現了
 TextView text = new TextView(mct);
ViewGroup.MarginLayoutParams lp = new ViewGroup.MarginLayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
text.setTextColor(mct.getResources().getColor(R.color.butler_area_textcolor));
text.setBackground(mct.getResources().getDrawable(R.drawable.bg_bulter_text));
text.setText(area.getAreaname());
lp.setMargins(140, 20, 140, 20);
holder.areaLayout.addView(text, lp);
這幾句就是呼叫它的核心程式碼

相關推薦

中使用流佈局實現標籤

我們在開發的時候通常需要加標籤,對於這個標籤怎麼說呢,反正也挺複雜的,最初開發這個標籤的時候還是沒有思路的,後來在github上面查找了一下資料,瞭解了通過流式佈局來實現這個標籤,我記得開始的時候我寫標籤的時候是三個TextView一個一個新增進去的,後來感覺還是不太好,所

佈局(可換行的標籤)

最近,公司的專案中需要展示商品的規格和屬性,但是不同的商品屬性個數也是不一樣的, 怎麼能夠讓超過一行的屬性自動換行呢?這就需要用到我們的流式佈局,下面先看看效果圖 這篇文章更改的,流式是怎麼實現的還是請先看完上邊這篇文章. 在將樓主的原始碼下載下來使用的時候遇到以下幾

-自定義佈局App開發思路 一步一個腳印(十)實現內嵌在app中的webview 騰訊開源X5 高效安全

實現內嵌在app中的webview 採用騰訊開源X5 高效安全 webview在app的使用中,十分頻繁,原生的webview載入速度相對來說很慢,而且很費流量。騰訊開源了x5的webview

沉浸狀態列開發 輸入法彈出遮擋佈局問題解決

公司新版APP採用沉浸式狀態列開發,開發過程中遇到一些奇葩問題,其中一個問題就是輸入法彈出後,佈局沒有被頂上去,無法看到輸入內容 解決方案,在程式碼中,設定 getWindow().setSoftInputMode( WindowManager.LayoutPara

FlowLayout流佈局實現搜尋歷史或熱門標籤

  最近專案中有這麼一個需求:實現搜尋歷史記錄的展示,預設只展示最近搜尋的10條記錄,並且最近搜尋的首先展示,其餘按搜尋時的先後順序依次展示;筆者想到(FlowLayout+SharedPreferences+List+TextView)來實現;   看一下實

-自定義佈局App開發思路 一步一個腳印(九)實現自定義滾動的新聞條目上下滾動-仿蘑菇街

實現自定義滾動的新聞條目上下滾動-仿蘑菇街       這種上下滾動的自定義佈局,就像是公告那種上下的翻滾,一般為文字的滾動,很明顯,就是自定義佈局,一般是線性佈局。這裡提到的安卓原生的控制元件自然是

the Percentage Layout of Android (的百分比佈局

不用wrap_content.match_parent來指定 控制元件的大小, 1.在app/bulid.gradle檔案的dependencies中新增 compile 'com.android.support:percent:24.2.1(注意在新增檔案之後要同步一下) 2.修改佈局檔案xml檔案中

觸控手勢事件實現圖片跟著手指移動和圖片縮放

效果如下: 佈局程式碼: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

使用sql語句實現SQLite資料庫的增刪改查

本篇博文是在上一篇新建了資料庫的基礎上編寫的,上一篇博文連結:https://blog.csdn.net/liyunfu233/article/details/84193368 首先在佈局檔案中新增四個按鍵分別是增刪改查四種方法,在主視窗類中實現四種方法: 第一個點選按鈕增加一條記錄

佈局 實現搜尋框

自定義View類 public class FlowLayout extends ViewGroup { public FlowLayout(Context context) { this(context,null); } public Flow

開發---基於SQLite實現增刪查改

一、關於SQLite  SQLite 是一個軟體庫,實現了自給自足的、無伺服器的、零配置的、事務性的 SQL 資料庫引擎。SQLite 是在世界上最廣泛部署的 SQL 資料庫引擎。SQLite 原始碼不受版權限制。 SQLite的核心引擎本身不依賴第三方的軟體,在

自定義 流佈局實現

首先佈局得清晰--建立一個自定義控制元件 <com.example.mr.flow     android:id="@+id/ffff"     android:layout_width="match_parent"     android:layout_height=

App登出登陸實現

一、Intent intent10=new Intent(MainActivity.this,LoginActivity.class); intent10.setFlags(Intent.FLAG_A

多級列表簡單實現

      二級listview我們可以使用expandablelistview,可以解決問題,但是要是多級的listview我們該怎麼辦。        網上有一個辦法就是expandablelis

基礎--三分鐘實現省市縣三級聯動

還記得之前課本上講的牛頓的那句名言吧?“如果我看得更遠一點的話,是因為我站在巨人的肩膀上。”所以說如果有巨人的肩膀還是要粘一下光的,哈哈。所以推薦一個非常好用的實現三級聯動的庫,有了這個,就可以三分鐘整合時間選擇器,省市縣選擇器。 專案地址:https://g

java中流佈局管理器(Flowlayout)的演示

/**  * 2018.8.8  * 作者:小孟魚  * 功能:流式佈局管理器(Flowlayout)的演示  */ package com.gui; import java.awt.FlowLayout; import javax.swing.JButton; impo

響應佈局實現方法

1,響應式佈局:簡而言之,就是一個網站能夠相容多個終端——而不是為每個終端做一個特定的版本。這個概念是為解決移動網際網路瀏覽而誕生的。 2,實現響應式佈局的三種方式     1. CSS3-Medi

Android本地Sqlite實現註冊賬號和登入功能

實現了註冊賬號時將資料寫入本地SQLite,登入賬號時從本地SQLite匹配資料,並有記住密碼功能,以及通過改密口令(類似於密保問題)修改密碼的功能 思路很簡單,登入賬號的時候,先去資料庫匹配賬號,如果匹配到了相同賬號,再去匹配同一行的密碼,匹配成功則登入成功,匹配不成功則

FlowLayout流佈局實現搜尋清空歷史記錄

效果圖:點選搜尋框將搜尋的歷史在流式佈局中展示出來,清空歷史記錄就會將歷史清空,每次搜尋後都存入sp中,每次進入頁面都先判斷sp裡是否有值並展示下載完這個工程後,需要將裡面的flowlayout-lib匯入到工程中,匯入工程的步驟:File - New - Import Mo

適配沉浸狀態列的新姿勢

Github Demo: https://github.com/lliuguangbo/AutoSystemBar 針對狀態列,官方從4.4版本開始支援,但是4.4和5.0以上API是不同的,6.0以上提供了兩種狀態列圖示樣式 分別是白色和黑色樣式。 針對狀態列圖示樣式的修改,小米