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