【问题标题】:addToBackStack Not workingaddToBackStack 不工作
【发布时间】:2017-02-24 15:58:59
【问题描述】:

我正在尝试关闭片段并希望通过在片段实现中使用 addToBackStack 来恢复主要活动,但它不起作用。后退按钮正在关闭应用程序。

我使用的片段实现方法是,

  private void dispaySelectedScreen(int id) {
    Fragment fragment = null;

    switch (id) {
        case R.id.facebook_login:
            fragment = new FacebookLogin();
            break;
        case R.id.memes:
            fragment = new Memes();
            break;
        case R.id.submit_image:
            fragment = new SubmitImage();
            break;
        case R.id.discussion:
            fragment = new Discussions();
            break;
        case R.id.invite:
            fragment = new Invite();
            break;
        case R.id.connect_fb:
            fragment = new FacebookConnect();
            break;
        case R.id.connect_twitter:
            fragment = new TwitterConnect();
            break;
        case R.id.connect_instagram:
            fragment = new InstaConnect();
            break;
    }

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




    }

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

我还为抽屉声明了一个 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();
    }


    }

请建议..

【问题讨论】:

  • 试试ft.addToBackStack(null)
  • @aksacha 不工作!!!还有什么建议吗??

标签: android android-studio android-fragments android-studio-2.2


【解决方案1】:

fragment.addToBackStack(null) 足以打开上一个活动,但是如果您想在除删除片段之外处理后按操作,那么我们将覆盖 onBackPressed(),所以这是我的经过测试的方法,请看一下:-

下面是我的实现:-

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        getSupportFragmentManager().beginTransaction().replace(R.id.fragment_holder, new MyFragment(), "MY_FRAG")
                .addToBackStack(null).commit();
    }

    @Override
    public void onBackPressed() {
        MyFragment fragment = (MyFragment) getSupportFragmentManager().findFragmentByTag("MY_FRAG");
        if (fragment != null) {
            if (fragment.isVisible()) {
                //todo perform any action if you want when fragment is removed
            }
        } else {
            super.onBackPressed();
        }
    }

【讨论】:

  • 谢谢@Mrinmoy。我只想关闭片段并返回活动,但 addToBackStack(null) 不起作用。是因为我在实现片段时提到的“如果”条件吗??
  • 移除 onBackPressed() 并尝试
【解决方案2】:

我看到你在事务上使用替换,这样你的片段将从堆栈中弹出,但它会重新加载,即该片段的 onCreateView() 将被调用。只需替换

 ft.replace(R.id.content_main, fragment);

 ft.add(R.id.content_main, fragment);

要处理后退按钮,请使用以下代码。

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

}

【讨论】:

  • 嗨@ADMthanx 寻求帮助.. 但这对我不起作用.. 我尝试替换你提到的代码并保持一切不变.. 后退按钮仍在关闭应用程序.. 做我需要在片段实现或 onBackPressed 方法中更改任何其他内容??
  • 不确定应用程序出了什么问题,但它也无法正常工作..我需要在 onKeyDown 中提及任何内容吗..我已经为主要活动中的 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(); } 其他 { 完成(); } 返回真; } } return super.onKeyDown(keyCode, event); } }'
  • 不需要keyDown只需覆盖onBackpreesed
猜你喜欢
  • 2014-01-07
  • 2016-05-18
  • 1970-01-01
  • 2014-12-28
  • 1970-01-01
  • 2020-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多