[英]How to handle onBackPressed() in multiple fragment
I am Android beginner, I am developing an app in which I have used multiple fragments through an activity. 我是Android初学者,正在开发一个应用程序,其中通过一个活动使用了多个片段。
private void displaySelectedScreen(int itemId) {
Fragment fragment = null;
switch (itemId) {
case R.id.nav_home:
fragment = new HomeFragment();
break;
case R.id.nav_attendance:
fragment = new AttendanceFragment();
break;
case R.id.nav_notification:
fragment = new NotificationFragment();
break;
case R.id.nav_event:
fragment = new EventFragment();
break;
case R.id.nav_fee:
fragment = new FeesFragment();
break;
case R.id.nav_news:
fragment = new NewsFragment();
break;
}
if (fragment != null) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.frame_container, fragment);
ft.addToBackStack(null);
ft.commit();
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
}
and use an onBackPressed()
method to close an app if the drawer is already close. 如果抽屉已经关闭,则使用
onBackPressed()
方法关闭应用程序。 Now I want to close an app if current fragment is HomeFragment
and if current fragment is not HomeFragment
then replace by HomeFragment
. 现在,如果当前片段为
HomeFragment
且当前片段不是HomeFragment
那么我想关闭一个应用程序,然后替换为HomeFragment
。 I don't know, how it does? 我不知道是怎么回事?
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout)findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
closeApp();
}
}
You can add tag to your fragment. 您可以将标签添加到片段中。 in this way you will only have to check the tag name.
这样,您只需要检查标签名称即可。
Fragment fragment = new Fragment();
getFragmentManager().beginTransaction()
.replace(R.id.FrameLayoutId,fragment,"TAG_NAME")
.addToBackStack("SOURCE_TAG_NAME").commit();
This is how to check your fragment tag, put this checking on your backpress method on the activity or in your closeApp()
method 这是检查片段标记的方法,将其放在活动的
closeApp()
方法或closeApp()
方法中
function void closeApp(){
Fragment fragment = getFragmentManager().findFragmentByTag("HomeActivity");
if (fragment != null) {
if(fragment.isVisible()){
HomeActivity.this.finish();
}
}
}
For simple, just go to your HomeFragment.java
and edit the method onBackPressed()
to exit the application using finish()
. 简单来说,只需转到
HomeFragment.java
并编辑onBackPressed()
方法onBackPressed()
使用finish()
退出应用程序。
And for others Fragment.java
, just use popBackStack()
function, you can search for it here : https://developer.android.com/reference/android/app/FragmentManager.html#popBackStack() 对于其他
Fragment.java
,只需使用popBackStack()
函数,就可以在这里搜索: https : //developer.android.com/reference/android/app/FragmentManager.html#popBackStack()
In your MainActivity class override onBackPressed
and display dialogbox there like this: 在您的MainActivity类中,重写
onBackPressed
并在其中显示对话框,如下所示:
@Override
public void onBackPressed() {
//show dialog box here
}
In each Fragment
implement onResume()
method with following code: 在每个
Fragment
使用以下代码实现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){
//homefragment class name
Class fragmentClass = HomeFragment.class;
try {
Fragment fragment = (Fragment) fragmentClass.newInstance();
FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit();
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
return false;
}
});
}
Use this code onBackPressed() method in NavigationActivity. 在NavigationActivity中使用此代码onBackPressed()方法。 I hope that can solve you.
希望能解决您的问题。
@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
Fragment f = getVisibleFragment();// to get which fragment now
if (f.getClass() != MainFragment.class) {
Fragment fragment = null;
try {
fragment = (Fragment) MainFragment.class.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.frame, fragment).commit(); // this is your framelayout
}else {
super.onBackPressed();
}
}
}
getVisibleFragment() function getVisibleFragment()函数
public Fragment getVisibleFragment() {
FragmentManager fragmentManager = NavigationActivity.this.getSupportFragmentManager();
List<Fragment> fragments = fragmentManager.getFragments();
if (fragments != null) {
for (Fragment fragment : fragments) {
if (fragment != null && fragment.isVisible())
return fragment;
}
}
return null;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.