【发布时间】:2023-03-06 12:53:01
【问题描述】:
我想重用后台堆栈中的片段,即隐藏并显示它是否存在于后台堆栈中。这是我的代码:
活动:`
public class MyActivity extends Activity implements View.OnClickListener{
Button b1;
Button b2;
Button b3;
Button b4;
FrameLayout frameLayout;
FrameLayout frameLayout2;
BlankFragment fragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
b1=(Button)findViewById(R.id.button1);
b2=(Button)findViewById(R.id.button2);
b3=(Button)findViewById(R.id.button3);
b1.setOnClickListener(this);
b2.setOnClickListener(this);
b3.setOnClickListener(this);
frameLayout =(FrameLayout)findViewById(R.id.frame1);
frameLayout2 =(FrameLayout)findViewById(R.id.frame2);
getFragmentManager().addOnBackStackChangedListener(listener);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.button1:{
manageFragment(1);
break;
}
case R.id.button2:{
manageFragment(2);
break;
}
case R.id.button3:{
manageFragment(3);
break;
}
}
}
private void manageFragment(int i) {
FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
BlankFragment blankFragment = (BlankFragment)manager.findFragmentByTag(""+i);
if(blankFragment !=null){
Log.v("123456","found the fragment in stack");
transaction.hide(fragment);
transaction.show(blankFragment);
transaction.commitAllowingStateLoss();
//if(i!=1){
//frameLayout2.setVisibility(View.GONE);
//frameLayout.setVisibility(View.VISIBLE);
//frameLayout.bringToFront();
//}else {
//frameLayout2.setVisibility(View.VISIBLE);
//frameLayout.setVisibility(View.GONE);
//frameLayout2.bringToFront();
}
fragment =blankFragment;
return;
}
fragment = BlankFragment.newInstance("", "" + i);
// if(i!=1){
// transaction.replace(R.id.frame1,fragment,""+i);
// frameLayout2.setVisibility(View.GONE);
// frameLayout.setVisibility(View.VISIBLE);
// frameLayout.bringToFront();
// }else{
// transaction.replace(R.id.frame2,fragment,""+i);
// frameLayout2.setVisibility(View.VISIBLE);
// frameLayout.setVisibility(View.GONE);
// frameLayout2.bringToFront();
// }
transaction.replace(android.R.id.content,fragment,""+i);
transaction.setTransition(FragmentTransaction.TRANSIT_NONE);
transaction.addToBackStack(""+i);
transaction.commitAllowingStateLoss();
}
FragmentManager.OnBackStackChangedListener listener = new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
int i =getFragmentManager().getBackStackEntryCount();
Log.v("123456","backstag count : "+i);
}
};
}
`
//注释代码的解释。 由于我有两个容器,我只能隐藏和显示(检索)2 个片段。由于我的第三个片段容器被重复使用,它的视图不会显示。
所以我尝试使用 android 容器,但根本无法显示来自 stag 的片段。
如何从堆栈中检索所有片段(这里计数为 3,可能是 N 个片段),我希望隐藏和显示片段不弹出。
【问题讨论】:
-
为什么不使用
transaction.replace? -
它将再次分离并附加。视图将再次加载。我不想再次加载它