【问题标题】:fragment backstack select pre fragment issue片段回栈选择前片段问题
【发布时间】:2018-02-05 07:15:16
【问题描述】:

我有底部导航并设置每个项目加载一个片段。当我的应用程序加载主页片段时默认选中。我的应用程序片段 Backstack 在导航时工作,例如单击 Posts > Search > Favor 并在按下后它的工作并返回到 Search > Post > Home 但是我的问题再次选择上一个片段,例如当导航 Post > Search > Post now when press back第一次按下不工作,不返回任何片段,第二次按下返回主页。我希望在导航“发布”>“搜索”>“按回发布”导航“搜索”>“主页”时使用这种格式。 我有 pushFragments 方法和 Override onBackPressed。我的代码是:

pushFragments 方法:

public void pushFragments(String tag, Fragment fragment){

    FragmentManager manager = getSupportFragmentManager();
    FragmentTransaction fTransaction = manager.beginTransaction();

    if (manager.findFragmentByTag(tag)==null){
        fTransaction.add(R.id.frame_fragmentMain_container,fragment,tag);
        fTransaction.addToBackStack(tag);
    }


    Fragment homeFragment = manager.findFragmentByTag(TAG_FRAGMENT_HOME);
    Fragment postsFragment = manager.findFragmentByTag(TAG_FRAGMENT_POSTS);
    Fragment usersFragment = manager.findFragmentByTag(TAG_FRAGMENT_USERS);
    Fragment searchFragment = manager.findFragmentByTag(TAG_FRAGMENT_SEARCH);
    Fragment favorFragment = manager.findFragmentByTag(TAG_FRAGMENT_FAVOR);

    // Hide all Fragment
    if(homeFragment!=null){
        fTransaction.hide(homeFragment);
    }

    if(postsFragment!=null){
        fTransaction.hide(postsFragment);
    }
    if(usersFragment!=null){
        fTransaction.hide(usersFragment);
    }
    if(searchFragment!=null){
        fTransaction.hide(searchFragment);
    }
    if(favorFragment!=null){
        fTransaction.hide(favorFragment);
    }

    switch (tag){
        case TAG_FRAGMENT_HOME:
            if(homeFragment!=null){
                fTransaction.show(homeFragment);
                setToolbarTitle("Home Page");
                disableNavigationToolbarIcon();
            }
            break;

        case TAG_FRAGMENT_POSTS:
            if(postsFragment!=null){
                fTransaction.show(postsFragment);
                setToolbarTitle("Posts List");
                enabledNavigationToolbarIcon();
            }
            break;

        case TAG_FRAGMENT_USERS:
            if(usersFragment!=null){
                fTransaction.show(usersFragment);
                setToolbarTitle("Authors List");
                enabledNavigationToolbarIcon();
            }
            break;
        case TAG_FRAGMENT_SEARCH:
            if(searchFragment!=null){
                fTransaction.show(searchFragment);
                setToolbarTitle("Search Page");
                enabledNavigationToolbarIcon();
            }
            break;
        case TAG_FRAGMENT_FAVOR:
            if(favorFragment!=null){
                fTransaction.show(favorFragment);
                setToolbarTitle("Favor Posts");
                enabledNavigationToolbarIcon();
            }
            break;
    }


    fTransaction.commitAllowingStateLoss();
}

并覆盖 onBackPressed:

    @Override
public void onBackPressed() {
    FragmentManager manager = getSupportFragmentManager();
    if(manager.getBackStackEntryCount()>1){
        for (Fragment fragment : manager.getFragments()){
            if(fragment.isVisible()){
                FragmentManager childManager = fragment.getChildFragmentManager();
                if(childManager.getBackStackEntryCount()>0){
                    if(fragment instanceof UsersFragment){
                        setToolbarTitle("Authors List");
                    }
                    childManager.popBackStack();
                    return;
                }
            }

        }
        manager.popBackStack();

    }else{
        new AlertDialog.Builder(this)
                .setTitle("Really Exit?")
                .setMessage("Are you sure you want to exit?")
                .setNegativeButton(android.R.string.no, null)
                .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {

                    public void onClick(DialogInterface arg0, int arg1) {
                        finish();
                        moveTaskToBack(true);
                    }
                }).create().show();
    }
}

【问题讨论】:

    标签: android android-fragments back-stack fragment-backstack


    【解决方案1】:

    试试这个..它肯定会工作..

    public void pushFragments(Fragment fragment) {
    
            try {
                String backStateName = fragment.getClass().getName();
                FragmentManager fragmentManager = getSupportFragmentManager();
                boolean fragmentPop = fragmentManager.popBackStackImmediate(backStateName, 0);
                if (!fragmentPop) {
                    try {
    
                        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                        fragmentTransaction.replace(R.id.frame_layout, fragment);
                        fragmentTransaction.addToBackStack(backStateName);
                        fragmentTransaction.commit();
                    } catch (Exception e) {
    
                    }
    
                }
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    

    在 OnBackPress 中 ---

     @Override
        public void onBackPressed() {
            if (getSupportFragmentManager().getBackStackEntryCount() == 1) {
                finish();
                return;
            }
            super.onBackPressed();
        }
    

    【讨论】:

    • 感谢您在导航“发布”>“搜索”>“发布”并按回首页时使用您的代码,我想要返回“搜索”>“首页”。你的代码的这一部分是什么? this.fragment = (BaseFragment) 片段;
    • 当导航发布 > 搜索 > 发布并按回它的主页我想要返回搜索 > 主页
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多