【问题标题】:Using back button to go back to main activity from fragment使用后退按钮从片段返回到主要活动
【发布时间】:2017-02-23 12:59:50
【问题描述】:

您好,我在应用程序抽屉中创建了片段,现在当我按下片段上的后退按钮时,它正在关闭应用程序。

Main activity的webView中已经存在一个onKeyDown了。

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (event.getAction() == KeyEvent.ACTION_DOWN) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_BACK:
                if (myWebView.canGoBack()) {
                    myWebView.goBack();
                } else {
                    finish();
                }
                return true;
        }
    }
    return super.onKeyDown(keyCode, event);

对于 onBackPressed 方法

@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        super.onBackPressed();
    }

片段实现方法,

if (fragment != null) {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.replace(R.id.content_main, fragment);
        ft.addToBackStack("close");
        ft.commit();




    }

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);

【问题讨论】:

  • 向我们展示您的片段实现。
  • 当您单击抽屉项目时,您能说出您添加fragments 的准确程度吗?
  • if (fragment != null) { FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.replace(R.id.content_main,片段); ft.commit(); } DrawerLayout 抽屉 = (DrawerLayout) findViewById(R.id.drawer_layout);抽屉.closeDrawer(GravityCompat.START);

标签: android android-layout android-fragments


【解决方案1】:

当您将片段添加到某个容器或使用 xml 对其进行膨胀时,它不会添加到后台堆栈中,因此,当“onBackPressed”发生时,它会从后台堆栈中抛出最后一个活动 - 这是托管片段的活动,因此退出应用程序。 我认为这个帖子: Android: Fragments backStack

可以帮助你,它解释了如何将片段交易添加到后台:

FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(..............);
    fragmentTransaction.addToBackStack("fragment transaction name, not required");
    fragmentTransaction.commit(); 

【讨论】:

  • 您好,感谢您的解决方案,但这对我不起作用..我已经用我的片段实现重新发布了这个问题......
【解决方案2】:

您需要按照以下方式执行此操作

@Override
public void onBackPressed() {
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
            //that means your stack is empty and you want to close activity
            finish();
        } else {
            // pop the backstack here
            getSupportFragmentManager().popBackStackImmediate();
        }
    }

}

【讨论】:

    【解决方案3】:

    我认为您不会将片段添加到后台堆栈中。

    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
    //your code
    fragmentTransaction.addToBackStack("your_tag");
    

    【讨论】:

      【解决方案4】:

      当你唤起一个片段时,像这样将它添加到堆栈中

      fragmentTransaction.addToBackStack("fragment");
      

      然后在 onBackPress 中像这样从堆栈中弹出它

      FragmentManager fm = getActivity()
                      .getSupportFragmentManager();
              fm.popBackStack ("fragment", FragmentManager.POP_BACK_STACK_INCLUSIVE);
      

      【讨论】:

        猜你喜欢
        • 2016-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多