【问题标题】:hide and show fragments ,Fragment view not visible隐藏和显示片段,片段视图不可见
【发布时间】: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
  • 它将再次分离并附加。视图将再次加载。我不想再次加载它

标签: android android-fragments


【解决方案1】:

基本上,你需要先了解片段事务是如何工作的。

fragment 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 已删除)
第三次后压您将看到空白屏幕。 (A 被删除)
这是堆栈的行为。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 2018-02-04
    • 2014-09-06
    相关资源
    最近更新 更多