我在我的项目中使用导航抽屉
我的项目包含一些片段文件和一些活动文件
我只需要任何文件可以给我onBackPressed()
,它应该回到以前的片段进行活动,反之亦然
例如:
启动:MainActivity > Fragment > Fragment > Activity
onBackPressed():Activity > Fragment > Fragment > MainActivity
---然后是一个带有Exit或Not 的dialogBox
我尝试了其他StackOverflow帖子中的一些方法,但没有一个帖子对我有效
尝试过的示例
@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
}
else {
HomeFragment fragment = new HomeFragment();
android.support.v4.app.FragmentTransaction fragmentTransaction =
getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, fragment);
fragmentTransaction.commit();
if (getFragmentManager().getBackStackEntryCount() == 0) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setCancelable(false);
builder.setMessage("Do you want to Exit?");
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//if user pressed "yes", then he is allowed to exit from application
finish();
}
});
builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//if user select "No", just cancel this dialog and continue with app
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
}
}
}
添加/替换/提交碎片事务时,需要调用addToBackStack
。当你点击一个链接或按钮时,或者无论你在做什么导航,这时你都需要启动一个片段事务,用你的新片段替换现有的片段。重要的是,在提交事务之前,你需要addToBackStack
这样做的目的是将当前片段添加到后台,因此当用户在新片段中按下后退按钮时,这些片段将返回到上一个片段
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, new_fragment_class).addToBackStack(null).commit();
你不会像现在这样在onBackPressed
方法中这样做,但当用户点击导航抽屉中的某个东西时。因此,您需要一种方法来捕捉用户在导航菜单项上的点击。例如:
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
switch (id) {
case R.id.nav_new:
//do your add/replace fragment transaction here
break;
}
}
一旦您有了实际的backback(使用上面的),看起来您的if (getFragmentManager().getBackStackEntryCount() == 0...
代码应该可以工作了。这只会检查当前后台文件中是否有任何项目,如果没有,则显示一个对话框
编辑:
以下是我如何使用导航抽屉处理碎片事务的示例:
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
NavigationView navigationView = null;
Toolbar toolbar = null;
FragmentManager fragmentManager = getSupportFragmentManager();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//set initial fragment to 'new' instead
addFragment(new NewFragment(), true);
//Set the toolbar
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
//Set navigation drawer
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();
navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
}
@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
//put your alert dialog code here
//if (getFragmentManager().getBackStackEntryCount() == 0) ...
}
}
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
// Replace these with your own menu items
switch (id) {
case R.id.nav_start:
addFragment(new StartFragment(), true);
break;
case R.id.nav_save:
addFragment(new SaveFragment(), true);
break;
case R.id.nav_raw:
addFragment(new RawFragment(), true);
break;
case R.id.nav_gyroscope:
addFragment(new GyroscopeFragment(), true);
break;
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
public void addFragment(Fragment fragment, Boolean addToBackStack) {
if (fragment != null) {
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, fragment, fragment.getClass().getSimpleName())
.addToBackStack(null)
.commit();
}
}
}