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

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


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

masterLayout.setVisibility(View.GONE);


它按预期工作。该视图将被删除,所有其他子视图也将相应上移,因此不会有多余的空白空间。问题是,当我确实离开该片段时(假设有一个可单击的视图将用户带到另一个片段),然后再次返回它(例如,使用带有onBackPressed()的后退按钮),masterLayout的cc>将不再显示。

我如何实现从布局中删除/隐藏特定视图的功能,使下一个视图向上移动以覆盖空白空间(如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);
}

07-24 09:26