【问题标题】:Back Navigation in AndroidAndroid中的返回导航
【发布时间】:2016-09-11 13:00:59
【问题描述】:

我是 android 的初学者,正在尝试开发一个我卡在后退导航中的 android 应用程序。我的问题是: 如何使用 Activity 和 Fragment 管理 backstack。

带有 frag1 的 A1 活动调用 A2 活动,A2 活动显示一个用户列表,单击列表以检查用户配置文件,调用带有 Frag 2 的 A1 活动。

在打开 A1 活动的 Frag2 时,我们使用意图标志:flag_activity_reorder_to_front 并使用 FragmentManager 事务将 frag1 添加到 backstack

现在如果我点击返回,它会显示带有 frag1 而不是 A2 Activity 的 A1 Activity。

如果我不将 frag1 添加到 backstack 中,然后返回,它适用于第一个返回,但在第二个返回时它会退出应用程序。

有什么建议吗?

【问题讨论】:

    标签: android navigation fragment-backstack


    【解决方案1】:

    尝试使用单个活动并使用接口处理其中的所有片段事务。 Activity 应该实现这个接口。 示例:

    public interface FragChanger {
        int NEXT_FRAGHELLO =1;
        int NEXT_FRAGSET = 2;
        int NEXT_FRAGSELECT =3;
        int NEXT_FRAGLOG=4;
        int NEXT_FRAGCHAT=5;
    
        void onFragmentChange(int nextFrag);
    
    
    }
    

    您的活动中应包含以下内容:

    @Override
        public void onFragmentChange(int nextFrag) {
    
            FragmentManager fm = getSupportFragmentManager();
            FragmentTransaction ft = fm.beginTransaction();
    
    
            switch (nextFrag){
                case NEXT_FRAGHELLO:
    
                    break;
                case NEXT_FRAGSET:
                     FragSet fragSet = new FragSet();
    
                    ft.replace(containerId,fragSet,"fragset");
                    ft.addToBackStack(null);
                    ft.commit();
    
                    break;
                case NEXT_FRAGSELECT:
                    FragSelect fragSelect = new FragSelect();
    
                    ft.replace(containerId,fragSelect,"fragselect");
                    ft.addToBackStack(null);
                    ft.commit();
                    break;
                case NEXT_FRAGCHAT:
                    FragChat fragChat = new FragChat();
                    ft.replace(containerId,fragChat,"fragchat");
                    ft.addToBackStack(null);
                    ft.commit();}
                    break;
    
                case NEXT_FRAGLOG:
    
                    ft.replace(containerId,fragLog,"fraglog");
                    ft.addToBackStack(null);
                    ft.commit();
                    break;
    }
    

    处理您的活动:

    @Override
        public void onBackPressed() {
            Log.d(TAG,"button back pressed");
           //Check which fragment is displayed an do whatever you need
           //for example like this
    if (getSupportFragmentManager().findFragmentById(containerId) instanceof FragLog){
            Fragment fl =  getSupportFragmentManager().findFragmentByTag("fraglog");
            if (fl !=null){
                FragmentManager fm = getSupportFragmentManager();
                FragmentTransaction ft = fm.beginTransaction();
    
                ft.remove(fl);
                ft.commit();
                return;
            }
            }
    
    
        }
    

    当然,这只是一个示例,但可能对您的情况有用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-10
      • 2020-07-06
      • 1970-01-01
      • 2022-07-22
      相关资源
      最近更新 更多