2016-12-05 72 views
1

我有一个活动和两个片段的Android应用程序。第一个片段(MainFragment)显示“项目”列表,第二个(DetailsFragment)显示项目的详细信息(非常基本)。回到默认片段

在正常流程中,活动启动并显示第一个片段,第二个片段显示在单击某个项目时。

但是第二个片段可以直接通过点击通知来显示(通过向活动添加额外的参数)。

String id = getIntent().getStringExtra("id"); 
FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 

if (id != null) { 
    fragment = new DetailsFragment(); 
    Bundle args = new Bundle(); 
    args.putString("id", id); 
    fragment.setArguments(args); 
} else { 
    fragment = new MainFragment(); 
} 

ft.replace(R.id.main, fragment); 
ft.commit(); 

在第二种情况下,问题是:如何从DetailsFragment点击回来的时候打开MainFragment?其实应用程序完成,因为只有第二个片段已被创建。

回答

2

First way:它很简单。你只需要使用addToBackStack(null)。它会保存你想要的片段,当你使用压缩时它会打开那个片段。

做这样的事情:

if (id != null) { 
    fragment = new DetailsFragment(); 
    Bundle args = new Bundle(); 
    args.putString("id", id); 
    fragment.setArguments(args); 
    ft.replace(R.id.main, fragment); 
    ft.commit(); 
} else { 
    fragment = new MainFragment(); 
    ft.replace(R.id.main, fragment).addToBackStack(null); 
    ft.commit(); 
} 

Second way:在DetailsFragment的的onResume()方法编写代码。

@Override 
    public void onResume() { 
     super.onResume(); 

    getView().setFocusableInTouchMode(true); 
      getView().requestFocus(); 
      getView().setOnKeyListener(new View.OnKeyListener() { 
       @Override 
       public boolean onKey(View v, int keyCode, KeyEvent event) { 


        if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) { 
         fragment = new MainFragment(); 
         fragmentManager = getFragmentManager(); 
         fragmentTransaction = fragmentManager.beginTransaction(); 
         fragmentTransaction.replace(R.id.main, fragment); 
         fragmentTransaction.commit(); 
         return true; 
        } 
        return false; 
       } 
      }); 
} 
+0

但是,当我从通知 – woprandi

+0

我我不会进入到'else'块应用我在回答中编辑的第二种方式。 –

1

这是Android中非常普遍的情况,只是简单地说你可以将它添加到backstack中。所以当用户按回按钮时,他会看到前一个片段(MainFragment)。

getFragmentManager() 
       .beginTransaction() 
       .addToBackStack(yourFragment.getClass().getSimpleName()) 
       .replace(R.example.container, yourFragment) 
       .commit(); 

有关于back stack

更新阅读官方Android文档:

如果打开DetailsFragment直接(不打开MainFragment),那么你应该检查返回堆叠,如果是空的,然后打开MainFragment手动。下面是完整的代码:

if (getSupportFragmentManager().getBackStackEntryCount() == 0) // empty back stack{ 
      getFragmentManager() 
          .beginTransaction() 
          .replace(R.example.container, MainFragment) 
         .commit(); 
    } 
+0

因为如果我直接进入'DetailsFragment',我不会添加'MainFragment',我不明白 – woprandi

+0

@woprandi如果您在开始时在您的活动中打开一个片段(例如onCreate),然后打开另一个片段DetailsFragment并那么如果你按下返回按钮,你将被定向到MainFragment。说得通? – szholdiyarov

+0

只有当我直接打开DetailsFragment(没有打开MainFragment之前)时,才会出现我的问题。如何总是返回到MainFragment,即使它尚未打开? – woprandi

0

您可以使用这样的事情,你的背部按或后退按钮点击

FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
fragment = new MainFragment(); 
ft.replace(R.id.fragment_container, frag); 
ft.commit(); 
+0

这不是一个好的解决方案,因为每次用户按下后退按钮时都会调用commit。此外,在这种情况下,开发人员需要重写onBackPressed并手动处理默认功能。 – szholdiyarov

+0

哦,是的,你是对的..感谢您的更正 –

0

添加片段这样

FragmentManager manager = getSupportFragmentManager(); 

FragmentTransaction ft = manager.beginTransaction(); 
ft.replace(containerId, fragment); 
ft.addToBackStack(backStateName); 
ft.commit(); 

,并在您的活动backpress把这个

getSupportFragmentManager().popBackStack(); 
+0

这里不需要popBackStack(),因为android会自行处理它。 – szholdiyarov

0

添加的主要片段在活动的onCreate()和覆盖onBackPressed()中的主要活动

FragmentTransaction mFragmentTransaction = fragmentManager.beginTransaction(); 


     mFragmentTransaction.replace(R.id.frame_container_recharege, fragment); 
     mFragmentTransaction.commit(); 

@Override 
     public void onBackPressed() { 
      FragmentManager fragmentManager = getSupportFragmentManager(); 
      if (fragmentManager.getBackStackEntryCount() > 1) { 
       fragmentManager.popBackStack(); 
      } else { 
       super.onBackPressed(); 

      } 


     } 
+0

它工作只是总是添加MainFragment之前,但我不喜欢,因为我会加载所有项目为空 – woprandi

+0

是的!您可以通过第二个片段直接oncreate()活动替换帧容器。如果您传递一些参数到活动。 –

+0

添加验证,如果用户点击通知,然后在后台添加片段,否则不添加在后台。同样的标志,你可以应用onBackPresed()。标志在通知上点击backPressPress()由主片段替换frameContainer。 –