首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Popbackstack完成OnBackPressed中的活动

Popbackstack完成OnBackPressed中的活动
EN

Stack Overflow用户
提问于 2015-05-14 14:49:17
回答 2查看 3.9K关注 0票数 0

我有一个包含两个片段(List & Details)的活动,在onCreate()中,如果savedInstance为null,我会启动列表片段,如下所示

代码语言:javascript
复制
 public static final int CLIENT_LIST_FRAGMENT = 1;
 public static final int CLIENT_DETAILS_FRAGMENT = 2;
 private int currentFragment = 0;

if (savedInstanceState == null) {
            //On first run, start the list fragment
            if (currentFragment == 0) {
                ClientListFragment listFrag = new ClientListFragment();
                getSupportFragmentManager().beginTransaction()
                        .add(R.id.container_client, listFrag, Constants.CLIENT_LIST_FRAGMENT_TAG)
                        .commit();
                currentFragment = CLIENT_LIST_FRAGMENT;
            } else {
                switch (currentFragment) {
                    case CLIENT_LIST_FRAGMENT:
                        addListFragment();
                        break;
                    case CLIENT_DETAILS_FRAGMENT:
                        addDetailsFragment(0);
                        break;
                }
            }
        }

下面是根据需要添加DetailsFragment和ListFragment的方法

代码语言:javascript
复制
 private void addListFragment(){
        ClientDetailsFragment listFrag = new ClientDetailsFragment();
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.container_client, listFrag, Constants.CLIENT_LIST_FRAGMENT_TAG)
                .addToBackStack("details")
                .commit();
        currentFragment = CLIENT_LIST_FRAGMENT;
    }

    private void addDetailsFragment(long companyId){
        ClientDetailsFragment detailsFrag = ClientDetailsFragment.newInstance(companyId);
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.container_client, detailsFrag, Constants.CLIENT_DETAILS_TAG)
                .addToBackStack(null)
                .commit();
        currentFragment = CLIENT_DETAILS_FRAGMENT;

    }

它的工作方式与预期一致,只是当我单击Details片段中的back按钮时,它实际上完成了活动,而不是返回到列表片段。它会返回列表片段一小段时间,然后完成主机活动并返回到调用活动。在经历了许多与onBackpress相关的问题之后,我如何才能停止这种行为?这是我对onBackPressed的概述

代码语言:javascript
复制
@Override
    public void onBackPressed() {
        if (currentFragment == CLIENT_DETAILS_FRAGMENT){
            getSupportFragmentManager().popBackStackImmediate();
        }else {
            super.onBackPressed();
        }
    }

谢谢

EN

回答 2

Stack Overflow用户

发布于 2018-06-02 05:21:17

Activity onBackPressed()应为:

对于android.support.v4.app.Fragment

代码语言:javascript
复制
@Override
public void onBackPressed() {
    if (getSupportFragmentManager().getBackStackEntryCount() > 1)
        getSupportFragmentManager().popBackStack();
    else
        finish();
}

对于android.app.Fragment

代码语言:javascript
复制
@Override
public void onBackPressed() {
    if (getFragmentManager().getBackStackEntryCount() > 1)
        getFragmentManager().popBackStack();
    else
        finish();
}
票数 1
EN

Stack Overflow用户

发布于 2015-05-14 18:37:15

代码语言:javascript
复制
 if (currentFragment == 0) {
            ClientListFragment listFrag = new ClientListFragment();
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.container_client, listFrag, Constants.CLIENT_LIST_FRAGMENT_TAG)
                    .commit();
            currentFragment = CLIENT_LIST_FRAGMENT;
        }

在将此添加更改为addToBackStack()时

并且,像这样更改onBackPressed(),

代码语言:javascript
复制
@Override
public void onBackPressed() {
 if (getFragmentManager().getBackStackEntryCount() == 1) {
     MainActivity.this.finish();
 }
 else {
    getFragmentManager().popBackStack();
  }
}

希望这能行得通。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30231072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档