添加子项后更新视图的尺寸

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。

【讨论】:

以上是关于添加子项后更新视图的尺寸的主要内容,如果未能解决你的问题,请参考以下文章

PySide Qt 在叶项处插入行并更新视图

Appcelerator Titanium 3.x/IOS7 无法将窗口添加为视图的子项

无法更新子项列表框

每次单击大纲视图行时,如何更新行值和子项

在 Android 中膨胀视图后,自定义视图子项为空

ASP.NET Core 3.1 - 将子项添加到剃刀局部视图