我想重新使用后堆栈中的片段,即隐藏并显示它是否存在于backstack中。这是我的代码:
活动:`
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容器,并且根本无法显示来自雄鹿的片段。
如何从堆栈中检索所有片段(此处为计数3,可能是N个片段),我想隐藏并显示片段而不是弹出。
答案 0 :(得分:0)
基本上,您需要了解片段事务的工作原理。
片段backstack实际上保留了您在事务中所做的事情。这是为了促进背压事件。防爆。你有片段A,B和C.
tx.replace(containerId, A);
tx.addToBackStack(null);
tx.replace(containerId, B);
tx.addToBackStack(null);
tx.replace(containerId, C);
tx.addToBackStack(null);
现在我们将在屏幕上看到C
第一次背压您将在屏幕上看到B片段。 (C被删除)
第二次背压你会看到A.(B被删除)
第3次背压你会看到空白屏幕。 (A被删除)
这是堆栈的行为。
所以,我认为你不需要背斜。你想要的只是什么
- 隐藏当前片段
- 如果不存在则添加新片段。 (不要使用替换)
- 如果给定标签片段存在,则显示它。