Android 棉花糖版本后的布局看起来很奇怪
嗨, 我正在做自定义布局。它在棒棒糖及以下版本的android上运行得非常好,但更高版本的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发
如何在add
xml
code for Help中显示它是一个动态布局,这就是为什么我添加了草图布局而不是实际布局确保您使用match\u parent
和wrap\u content
发布您的xml代码请注意addxml
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();
}
}
}
}