在 ConstraintLayout 的可见性设置为 View.GONE 后恢复视图

Restore view in ConstraintLayout after it's visibility has been set to View.GONE

我正在构建的应用程序有一个用例,在该用例中,我根据一些数据在 Fragment 中创建了部分。为了形象化,给定的片段 A 具有主容器元素为 ScrollView 的布局。在那里,滚动视图有一个工具栏(与这个问题无关),然后是 ConstraintLayout(显示所有片段的内容,我们称之为 masterLayout)。我需要做的是,基于 boolean(我们称之为 hasSection)从 masterLayout 中删除一个视图组件。因此,有时片段 A 会显示 masterLayout(它不在容器中的位置 0 - 它是视图树中的第 5 个组件),有时不会。现在,我试着简单地调用:

((ViewGroup)masterLayout.getParent()).removeView(masterLayout);

部分有效。这里的问题是,视图被删除了,但是它占用的 space 没有。因此,视图树中该视图之后出现的任何其他子项都不会 "moved up"。我不能这样,因为 masterLayout 的高度 = 200dp。如您所见,它将占据屏幕的很大一部分。因此,在研究网络后,我找到了设置其可见性的解决方案:

masterLayout.setVisibility(View.GONE);

按预期工作。视图被删除,所有进一步的子视图都相应地向上移动,因此没有空的和不需要的 space。问题是,当我从那个片段过渡时(假设有一个可点击的视图将用户带到另一个片段)并再次返回它(例如使用带 onBackPressed() 的后退按钮) , masterLayout 已设置为 visibility = View.GONE 将不再显示。

如何从布局中实现 removing/hiding 特定视图的功能,使其下方的下一个视图向上移动以覆盖空 space(就像 View.GONE 那样)在导航回描述的片段时恢复原始布局?

逻辑的完整代码:

if(isTypeA){
        new FetchUser(USERID){
            @Override
            protected void onPostExecute(User user){
                mUser = user;
            }
        }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

        new FetchImages(mUser.getType()){
            @Override
            protected void onPostExecute(List<Image> result){
                if(mImageList.isEmpty() && !result.isEmpty()){
                    mImageList.addAll(result);
                    mAdapter = new ItemAdapter(getChildFragmentManager(), mImageList.size(), mImageList);
                    mItemCardPager.setAdapter(mAdapter);
                }else{
                    if(mMasterLayout != null){
                        mMasterLayout.setVisibility(View.GONE);
                    }
                }
            }
        }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
    }

Fragment lifecycle 可以提供帮助。

一种方法是始终在片段的 onResume 方法中恢复 masterLayout 的可见性 View.VISIBLE。

@Override
public void onResume() {
    super.onResume();
    masterLayout.setVisibility(View.VISIBLE);
}