Android自動換行的RadioGroup
阿新 • • 發佈:2018-12-03
找了很多自動換行的RadioGroup,但是在新增radiobutton時,radiobutton的內容過長造成顯示不全,最終找到以下版本的RadioGroup
public class FlowRadioGroup extends RadioGroup { List<List<View>> mAllViews;//儲存所有行的所有View List<Integer> mLineHeight;//儲存每一行的行高 public FlowRadioGroup(Context context) { this(context, null); } public FlowRadioGroup(Context context, AttributeSet attrs) { super(context, attrs); init(); } private void init() { setOrientation(LinearLayout.HORIZONTAL); } /** * 獲取選中按鈕的索引,從開始, 未選中返回 -1 */ public int getCheckedRadioButtonIndex() { return indexOfChild(findViewById(getCheckedRadioButtonId())); } /** * 獲取選中按鈕的文字,未選中 返回 空字串 */ public String getCheckedRadioButtonText() { if (getCheckedRadioButtonId() == -1) { return ""; } return ((RadioButton) findViewById(getCheckedRadioButtonId())).getText().toString(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int sizeWidth = MeasureSpec.getSize(widthMeasureSpec); int modeWidth = MeasureSpec.getMode(widthMeasureSpec); int sizeHeight = MeasureSpec.getSize(heightMeasureSpec); int modeHeight = MeasureSpec.getMode(heightMeasureSpec); int width = 0, height = 0; int lineWidth = 0, lineHeight = 0; int childWidth = 0, childHeight = 0; mAllViews = new ArrayList<>(); mLineHeight = new ArrayList<>(); List<View> lineViews = new ArrayList<>(); int count = getChildCount(); for (int i = 0; i < count; i++) { View child = getChildAt(i); if (child.getVisibility() == View.GONE) { continue; } measureChild(child, widthMeasureSpec, heightMeasureSpec); LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) child.getLayoutParams(); childWidth = child.getMeasuredWidth() + params.leftMargin + params.rightMargin; childHeight = child.getMeasuredHeight() + params.topMargin + params.bottomMargin; if (lineWidth + childWidth > sizeWidth - getPaddingLeft() - getPaddingRight()) { width = Math.max(width, lineWidth); height += lineHeight; mLineHeight.add(lineHeight); mAllViews.add(lineViews); lineWidth = childWidth; lineHeight = childHeight; lineViews = new ArrayList<>(); } else { lineWidth += childWidth; lineHeight = Math.max(childHeight, lineHeight); } lineViews.add(child); if (i == (count - 1)) { width = Math.max(width, lineWidth); height += lineHeight; } } mLineHeight.add(lineHeight); mAllViews.add(lineViews); width += getPaddingLeft() + getPaddingRight(); height += getPaddingTop() + getPaddingBottom(); setMeasuredDimension(modeWidth == MeasureSpec.AT_MOST ? width : sizeWidth, modeHeight == MeasureSpec.AT_MOST ? height : sizeHeight); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { int top = getPaddingTop();//開始佈局子view的 top距離 int left = getPaddingLeft();//開始佈局子view的 left距離 int lineNum = mAllViews.size();//行數 List<View> lineView; int lineHeight; for (int i = 0; i < lineNum; i++) { lineView = mAllViews.get(i); lineHeight = mLineHeight.get(i); for (int j = 0; j < lineView.size(); j++) { View child = lineView.get(j); if (child.getVisibility() == View.GONE) { continue; } LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) child.getLayoutParams(); int ld = left + params.leftMargin; int td = top + params.topMargin; int rd = ld + child.getMeasuredWidth();//不需要加上 params.rightMargin, int bd = td + child.getMeasuredHeight();//不需要加上 params.bottomMargin, 因為在 onMeasure , 中已經加在了 lineHeight 中 child.layout(ld, td, rd, bd); left += child.getMeasuredWidth() + params.leftMargin + params.rightMargin;//因為在 這裡添加了; } left = getPaddingLeft(); top += lineHeight; } } @Override protected void onFinishInflate() { super.onFinishInflate(); // check(getChildAt(0).getId());//預設按鈕 } @Override protected Parcelable onSaveInstanceState() { Parcelable superState = super.onSaveInstanceState(); return new SavedState(superState, getCheckedRadioButtonIndex()); } @Override protected void onRestoreInstanceState(Parcelable state) { SavedState ss = (SavedState) state; super.onRestoreInstanceState(ss.getSuperState()); setCheckedStateForView(ss.checkIndex, true); } private void setCheckedStateForView(int checkIndex, boolean checked) { View checkedView = getChildAt(checkIndex); if (checkedView != null && checkedView instanceof RadioButton) { ((RadioButton) checkedView).setChecked(checked); } } public static class SavedState extends BaseSavedState { public static final Creator<SavedState> CREATOR = new Creator<SavedState>() { @Override public SavedState createFromParcel(Parcel in) { return new SavedState(in); } @Override public SavedState[] newArray(int size) { return new SavedState[size]; } }; private int checkIndex;//選中按鈕的索引 public SavedState(Parcelable parcel, int checkIndex) { super(parcel); this.checkIndex = checkIndex; } private SavedState(Parcel in) { super(in); checkIndex = in.readInt(); } @Override public void writeToParcel(Parcel out, int flags) { super.writeToParcel(out, flags); out.writeInt(checkIndex); } } }