添加子项后更新视图的尺寸
Posted
技术标签:
【中文标题】添加子项后更新视图的尺寸【英文标题】:Update View's dimensions after adding children 【发布时间】:2017-10-02 18:39:02 【问题描述】:我有一个RelativeLayout
和一个ConstraintLayout
(以及其他一些东西),我正在以编程方式填充儿童。初始化所有子视图后,我很难调整父 RelativeLayout
的大小。
基本上我想要实现的是:
quick mockup
这里是代码sn-ps:
@BindView(R.id.session_summary_items_include_correct) View mCardCorrect;
//...
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
View view = inflater.inflate(R.layout.fragment_session_summary_items, container, false);
ButterKnife.bind(this, view);
correctCard = new IncludedCard();
ButterKnife.bind(correctCard, mCardCorrect);
initializeViews();
mCardCorrect.post(() -> resizeView(mCardCorrect));
return view;
private void initializeViews()
ArrayList<MyClass> items = MyClass.GetItems();
LayoutInflater layoutInflater = (LayoutInflater) getActivity().getApplicationContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (items.size() > 0)
correctCard.mCardTitle.setText("Correct Card");
ArrayList<View> views = getItemViews(items, layoutInflater);
populateLayoutWithItemViews(correctCard.mConstraintLayout, views);
private ArrayList<View> getItemViews(ArrayList<MyClass> items, LayoutInflater inflater)
ArrayList<View> results = new ArrayList<>();
for (MyClass item : items)
View view = inflater.inflate(R.layout.item_view, null);
TextView mTextTitle = (TextView) view.findViewById(R.id.item_view_title);
mTextTitle .setText(item.getTitle());
results.add(view);
return results;
private void populateLayoutWithItemViews(ConstraintLayout layout, ArrayList<View> items)
ConstraintSet constraintSet = new ConstraintSet();
constraintSet.clone(layout);
for (int idx = 0; idx < items.size(); idx ++)
View item = items.get(idx);
item.setId(View.generateViewId());
layout.addView(item);
// constraintSet magic to make them connect as expected
constraintSet.applyTo(layout);
private void resizeView(View view)
view.setLayoutParams(new RelativeLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
static class IncludedCard
@BindView(R.id.card_title) TextView mCardTitle;
@BindView(R.id.card_layout) ConstraintLayout mConstraintLayout;
现在,问题是,无论何时何地,我将测量/调整 mCardCorrect 视图的大小,结果是相同的:它将被测量到卡片标题,就好像 ConstraintLayout 中的子项不存在一样.像这样:
measurement bounding box
我尝试过发布测量结果/调整大小到 Runnable,如下所示:FrameLayout child view not updating correctly on resize ,并使用 OnGlobalLayoutListener,如下所示:android: set view height via ViewTreeObserver 。我仍然是一个 Android 新手,这是我的第一个项目,所以任何帮助将不胜感激。谢谢!
【问题讨论】:
【参考方案1】:您需要约束每个视图。来自"Build a Responsive UI with ConstraintLayout":
...如果在设备上运行布局时视图没有约束,它会在位置 [0,0](左上角)处绘制。
您添加的所有视图都不受约束,因此它们都在 (0, 0) 处相互重叠。
看起来您正确设置了ConstraintSet
,您只需要使用ConstraintSet
添加约束。网上有一些很好的教程演示了如何做到这一点。 Here 是其中之一。也可以参考official documenation。
【讨论】:
以上是关于添加子项后更新视图的尺寸的主要内容,如果未能解决你的问题,请参考以下文章