Android 棉花糖版本后的布局看起来很奇怪

Android 棉花糖版本后的布局看起来很奇怪,android,android-layout,android-linearlayout,android-6.0-marshmallow,Android,Android Layout,Android Linearlayout,Android 6.0 Marshmallow,嗨, 我正在做自定义布局。它在棒棒糖及以下版本的android上运行得非常好,但更高版本的android显示出怪异的外观 如何在addxmlcode for Help中显示它是一个动态布局,这就是为什么我添加了草图布局而不是实际布局确保您使用match\u parent和wrap\u content发布您的xml代码请注意addxmlcode for Help的可能副本它是一个动态布局,这就是我添加草图布局而非实际布局的原因。请确保使用match\u parent和wrap\u content发

嗨, 我正在做自定义布局。它在棒棒糖及以下版本的android上运行得非常好,但更高版本的android显示出怪异的外观


如何在add
xml
code for Help中显示它是一个动态布局,这就是为什么我添加了草图布局而不是实际布局确保您使用
match\u parent
wrap\u content
发布您的xml代码请注意add
xml
code for Help的可能副本它是一个动态布局,这就是我添加草图布局而非实际布局的原因。请确保使用
match\u parent
wrap\u content
发布您的xml代码
public class TableListView extends LinearLayout {

private final ViewGroup headerLinearLayout;

public TableListView(final Context context) {
    this(context, null);
}

public TableListView(final Context context, final AttributeSet attributeSet) {
    super(context, attributeSet);

    setOrientation(LinearLayout.VERTICAL);

    final ViewsCreator viewsCreator = new ViewsCreator();
    headerLinearLayout = viewsCreator.createHeaderViews(context, attributeSet);
    columnNameIndices = viewsCreator.getColumnNameIndexMap();

    addView(headerLinearLayout);
    addView(listView);
}

private static class ViewsCreator {
    private final Map<String, Integer> columnNameIndices = new HashMap<String, Integer>();

    private ViewsCreator() {
    }

    public ViewGroup createHeaderViews(final Context context, final AttributeSet attributeSet) {
        final HeaderView.HeaderParams headerParams = new HeaderView.HeaderParams(context, attributeSet);
        final LinearLayout headerLinearLayout = new LinearLayout(context);
        headerLinearLayout.setOrientation(LinearLayout.HORIZONTAL);

        final int numberOfColumns = headerParams.getNumOfColumns();

        for (int i = 0; i < numberOfColumns; ++i) {
            final String headerName = headerParams.headerNames[i].toString();
            headerLinearLayout.addView(new HeaderView(context, headerParams, i, headerName));
            columnNameIndices.put(headerName, i);
        }

        final ViewTreeObserver viewTreeObserver = headerLinearLayout.getViewTreeObserver();
        final ViewsCreatorOnPreDrawListener preDrawListener = new ViewsCreatorOnPreDrawListener(headerLinearLayout);
        viewTreeObserver.addOnPreDrawListener(preDrawListener);

        return headerLinearLayout;
    }

    public Map<String, Integer> getColumnNameIndexMap() {
        return columnNameIndices;
    }

    private static class ViewsCreatorOnPreDrawListener implements ViewTreeObserver.OnPreDrawListener {
        private final ViewGroup viewGroup;
        private int largestHeaderHeight = 0;

        public ViewsCreatorOnPreDrawListener(final ViewGroup viewGroup) {
            this.viewGroup = viewGroup;
        }

        @Override
        public boolean onPreDraw() {
            final ViewTreeObserver viewTreeObserver = viewGroup.getViewTreeObserver();

            viewTreeObserver.removeOnPreDrawListener(this);

            final int childCount = viewGroup.getChildCount();
            for (int i = 0; i < childCount; ++i) {
                final View childHeaderView = viewGroup.getChildAt(i);

                final int height = childHeaderView.getHeight();
                if (largestHeaderHeight < height) {
                    largestHeaderHeight = height;
                }
            }

            for (int i = 0; i < childCount; ++i) {
                final View childHeaderView = viewGroup.getChildAt(i);

                final ViewGroup.LayoutParams layoutParams = childHeaderView.getLayoutParams();
                layoutParams.height = largestHeaderHeight;
            }

            return false;
        }
    }
}

/**
 * Represents a header in this {@link TableListView}.
 */
private static class HeaderView extends RelativeLayout {
    private ImageView ivIcon;
    private TextView tvName;
    private ImageView ivArrow;

    public HeaderView(final Context context, final HeaderParams headerParams, final int index, final String name) {
        super(context);
        setGravity(Gravity.CENTER);
        setBackgroundResource(headerParams.headerBackground);
        setLayoutParams(
                new LinearLayout.LayoutParams(0, headerParams.headerHeight, headerParams.headerWeights[index]));

        addNameView(context, headerParams, name);
        addArrowView(context, headerParams);
        addIconView(context, headerParams, index);
    }

    private void addArrowView(final Context context, final HeaderParams headerParams) {
        ivArrow = new ImageView(context);
        this.addView(ivArrow);
        ivArrow.setId(R.id.iv_header_arrow);
        final RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) ivArrow.getLayoutParams();
        params.addRule(RelativeLayout.RIGHT_OF, android.R.id.title);
        params.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE);
        params.leftMargin = context.getResources().getDimensionPixelSize(R.dimen.pixel_2dp);
        params.width = context.getResources().getDimensionPixelSize(R.dimen.pixel_9dp);
        params.height = context.getResources().getDimensionPixelSize(R.dimen.pixel_8dp);
        ivArrow.setScaleType(ImageView.ScaleType.FIT_XY);
        ivArrow.setLayoutParams(params);
        setArrowResIds(headerParams.headerArrowUp, headerParams.headerArrowDown);
    }

    private void addIconView(final Context context, final HeaderParams headerParams, final int index) {
        if (headerParams.headerIconIndexes.indexOf(index) >= 0) {
            ivIcon = new ImageView(context);
            this.addView(ivIcon);
            ivIcon.setImageResource(headerParams.headerIcon);
            final LayoutParams params = (LayoutParams) ivIcon.getLayoutParams();
            params.addRule(RelativeLayout.LEFT_OF, android.R.id.title);
            params.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE);
            params.rightMargin = context.getResources().getDimensionPixelSize(R.dimen.pixel_2dp);
            ivIcon.setLayoutParams(params);
        }
    }

    private void addNameView(final Context context, final HeaderParams headerParams, final String name) {
        tvName = new TextView(context);
        this.addView(tvName);
        tvName.setId(android.R.id.title);
        tvName.setText(name);
        tvName.setTextColor(context.getResources().getColor(headerParams.headerTextColor));
        tvName.setTextSize(TypedValue.COMPLEX_UNIT_PX, headerParams.headerTextSize);
        if (!TextUtils.isEmpty(headerParams.headerTypeface)) {
            final Typeface typeface =
                    FontManager.getInstance().getFontByName(headerParams.headerTypeface.toString());
            tvName.setTypeface(typeface, Typeface.BOLD);
        } else {
            tvName.setTypeface(Typeface.DEFAULT_BOLD);
        }
        final RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) tvName.getLayoutParams();
        params.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);
        params.width = ViewGroup.LayoutParams.WRAP_CONTENT;
        params.height = ViewGroup.LayoutParams.MATCH_PARENT;
        tvName.setGravity(Gravity.CENTER);
        tvName.setLayoutParams(params);
    }

    private static class HeaderParams {
        private final CharSequence[] headerNames;
        private final float[] headerWeights;
        private final int headerHeight;
        private final int headerBackground;
        private final int headerArrowUp;
        private final int headerArrowDown;
        private final int headerIcon;
        private final List<Integer> headerIconIndexes = new ArrayList<>();
        private final int headerTextColor;
        private final CharSequence headerTypeface;
        private final int headerTextSize;

        public HeaderParams(final Context ctx, final AttributeSet attributeSet) {
            final TypedArray typedArray = ctx.obtainStyledAttributes(attributeSet, R.styleable.TableListView);

            headerNames = typedArray.getTextArray(R.styleable.TableListView_headerNameArray);

            final CharSequence[] weightsArr = typedArray.getTextArray(R.styleable.TableListView_headerWeightArray);
            headerWeights = new float[weightsArr.length];
            for (int i = 0; i < weightsArr.length; i++) {
                headerWeights[i] = Float.valueOf(weightsArr[i].toString());
            }

            headerHeight = typedArray.getDimensionPixelSize(R.styleable.TableListView_headerHeight,
                                                            ViewGroup.LayoutParams.WRAP_CONTENT);
            headerBackground = typedArray.getResourceId(R.styleable.TableListView_headerBackground, 0);
            headerArrowUp = typedArray.getResourceId(R.styleable.TableListView_headerArrowUp, 0);
            headerArrowDown = typedArray.getResourceId(R.styleable.TableListView_headerArrowDown, 0);
            headerIcon = typedArray.getResourceId(R.styleable.TableListView_headerIcon, 0);

            final CharSequence[] iconIndexes = typedArray.getTextArray(R.styleable.TableListView_headerIconIndexes);
            if (iconIndexes != null) {
                for (final CharSequence iconIndex : iconIndexes) {
                    headerIconIndexes.add(Integer.valueOf(iconIndex.toString()));
                }
            }

            headerTextColor = typedArray.getResourceId(R.styleable.TableListView_headerTextColor, R.color.white);
            headerTypeface = typedArray.getText(R.styleable.TableListView_headerTypeface);

            final int defSize = ctx.getResources().getDimensionPixelSize(R.dimen.pixel_8dp);
            headerTextSize = typedArray.getDimensionPixelSize(R.styleable.TableListView_headerTextSize, defSize);
            typedArray.recycle();
        }
    }
}
}