Android onBackPressed()返回到以前的Fragment/Activity



我在我的项目中使用导航抽屉

我的项目包含一些片段文件和一些活动文件

我只需要任何文件可以给我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();
        }
    }
}

最新更新