我正在构建的应用程序有一个用例,其中基于一些数据,我在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);
}