隐藏和显示片段,片段视图不可见

时间:2014-09-30 03:58:53

标签: android android-fragments

我想重新使用后堆栈中的片段,即隐藏并显示它是否存在于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个片段),我想隐藏并显示片段而不是弹出。

1 个答案:

答案 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被删除)
这是堆栈的行为。

所以,我认为你不需要背斜。你想要的只是什么 - 隐藏当前片段
- 如果不存在则添加新片段。 (不要使用替换)
- 如果给定标签片段存在,则显示它。