繁体   English   中英

使用addToBackStack()时片段表现奇怪

[英]Fragments Behave Weirdly When Using addToBackStack()

GitHub上提供了此问题的SSCCE。

对于将来的读者,原始示例在同一项目分支上 ,并且此diff中提供了修复程序。

该SSCCE具有一个ListView和一行按钮。 应该使用这些按钮来更改ListView中的数据,并且应该使用listView行(单击时)打开一个新的片段,并在保持相同活动的同时推进后退堆栈。

如果执行以下操作,则会产生以下结果:

  1. 开启应用程式。
  2. 点击ListView。 -具有addToBackStack(true) FragmentTransaction.replace(...) addToBackStack(true)
  3. 点击任意按钮。 -具有addToBackStack(false) FragmentTransaction.replace(...) addToBackStack(false)
  4. 点击后退按钮。

结果:

重叠片段

这两个片段都可见,但是我只希望显示第一个加载的片段(代码中的ListTwoFragment )。 这是片段应该如何工作的方式吗? 如果是这样,我如何获得理想的效果?

MainActivity.java:

public class MainActivity extends FragmentActivity implements ListTwoFragment.Callbacks,
    ListThreeFragment.Callbacks {
    public static final String KEY_ARGS = "args";

    private String curUri = "";
    private String curArgs = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        selectContent(false);
    }

    private void selectContent(boolean addToBackStack) {
        Fragment fragment;

        if (curUri.isEmpty()) {
            // Use default fragment
            fragment = new ListTwoFragment();
            curUri = ListTwoFragment.class.getName();
        }
        else {
            try {
                Class<Fragment> fragmentClass = (Class<Fragment>) Class.forName(curUri);
                fragment = fragmentClass.newInstance();
            }
            catch (Exception e) { // ClassNotFound, IllegalAccess, etc.
                return;
            }
        }

        // Configure fragment
        Bundle args = new Bundle();
        args.putString(KEY_ARGS, curArgs);
        fragment.setArguments(args);

        attachFragment(fragment, addToBackStack, curUri + ";" + curArgs, R.id.fragment_container);
    }

    protected void attachFragment(Fragment fragment, boolean addToBackStack, String tag, int replaceId) {
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.replace(replaceId, fragment, tag);
        if (addToBackStack) transaction.addToBackStack(tag);
        transaction.commit();
    }

    @Override
    public void onTwoButtonClick(String title) {
        curUri = ListTwoFragment.class.getName();
        curArgs = title;
        selectContent(false);
    }

    @Override
    public void onTwoListClick() {
        curUri = ListThreeFragment.class.getName();
        curArgs = "";
        selectContent(true);
    }

    @Override
    public void onThreeButtonClick(String title) {
        curUri = ListThreeFragment.class.getName();
        curArgs = title;
        selectContent(false);
    }
}

我正在使用Fragments,以及它的操作方式:前进(添加到堆栈)和反向词(从堆栈中删除)是两个不同的功能

添加到堆栈并更改片段:

public void changeFragmentAddToStack(Fragment myNewFragment) {
        FragmentTransaction t = getSupportFragmentManager().beginTransaction();
        t.add(R.id.main_fragment, myNewFragment);
        t.addToBackStack(null);
        t.commit();
    }

返回堆栈:

        public void goBackStackMain() {
    FragmentManager man = getSupportFragmentManager();

                if(man.getBackStackEntryCount()>0){ 
                    man.popBackStack(man.getBackStackEntryAt(0).getName(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
            }
}

如果您想两者都做,请执行以下操作:返回堆栈并更改片段:

    public void goBackStackAndReplaceFragment(Fragment myNewFragment) {
FragmentManager man = getSupportFragmentManager();
            if(man.getBackStackEntryCount()>0){ 
                int n = man.getBackStackEntryCount();
                man.popBackStack(man.getBackStackEntryAt(n-1).getName(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
            }

        FragmentTransaction t = getSupportFragmentManager().beginTransaction();
        t.replace(R.id.main_fragment, myNewFragment);
        t.commit();
    }

希望对您有所帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM