【问题标题】:Android onBackPressed() come back to previous Fragment/ActivityAndroid onBackPressed() 回到之前的 Fragment/Activity
【发布时间】:2016-04-03 09:35:11
【问题描述】:

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

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

我只需要我可能需要的任何文件onBackPressed() 它应该返回到之前的活动片段,反之亦然

例如:

开始MainActivity > Fragment > Fragment > Activity

onBackPressed()Activity > Fragment > Fragment > MainActivity --- 然后是 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 方法吗?
  • 如何实现..???请问你能编辑上面的代码吗
  • 不仅这个地方要编辑。它应该从头开始编辑。从 Fragment1 到 Fragment2 的示例,您应该将替换事务添加到 backstack。
  • 你能分享你的邮件ID吗?
  • 您可以使用pastebin.com 分享您的代码。

标签: android android-activity fragment onbackpressed


【解决方案1】:

添加/替换/提交片段事务时需要调用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;
    }    
}

一旦你有了实际的后台堆栈(上面的),看起来你的if (getFragmentManager().getBackStackEntryCount() == 0... 代码应该可以工作了。那只会检查当前的backstack中是否有任何项目,如果没有,则显示一个对话框

编辑:

这是我如何使用导航抽屉处理片段事务的示例:

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();
        }
    }
}

【讨论】:

  • 您需要更具体地说明您做了什么,什么没用。使用新代码更新您的原始代码
  • 查看我的编辑以获取工作示例(您需要更改变量名称等以使其适用于您的情况)
  • 您在编辑的代码示例中设置它的方式将在按下返回时创建一个新片段(HomeFragment)。这不是您想要的行为,因为您的后退按钮无法正常工作,只会继续重新显示该片段。尝试删除您创建和提交 Home 片段事务的整个代码部分
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多