使用片段实现ActionBar的向上导航

9 浏览
0 Comments

使用片段实现ActionBar的向上导航

我有一个带有选项卡的Actionbar/viewpager布局,有三个选项卡A、B和C。在选项卡C的片段中,我添加了另一个片段D。代码如下:

DFragment f= new DFragment();

ft.add(android.R.id.content, f, "");

ft.remove(CFragment.this);

ft.addToBackStack(null);

ft.commit();

我在DFragment的onResume中修改了actionbar以添加返回按钮:

ActionBar ab = getActivity().getActionBar();

ab.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);

ab.setDisplayHomeAsUpEnabled(true);

ab.setDisplayShowHomeEnabled(true);

现在,在DFragment中,当我按下手机的返回按钮时,我返回到原始的选项卡(ABC)布局,并且选中了CFragment。如何通过actionbar的返回按钮实现这个功能?

0
0 Comments

问题出现的原因:在使用actionbar的返回按钮时,点击按钮没有返回到所期望的fragment。

解决方法:在主activity的onCreate方法中添加以下代码:

getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
        public void onBackStackChanged() {
            int stackHeight = getSupportFragmentManager().getBackStackEntryCount();
            if (stackHeight > 0) { // if we have something on the stack (doesn't include the current shown fragment)
                getSupportActionBar().setHomeButtonEnabled(true);
                getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            } else {
                getSupportActionBar().setDisplayHomeAsUpEnabled(false);
                getSupportActionBar().setHomeButtonEnabled(false);
            }
        }
    });

并且添加以下方法:

public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            getSupportFragmentManager().popBackStack();
            return true;
     ....
 }

这段代码可实现返回到之前的fragment。但是需要注意的是,这只适用于返回到之前的fragment,如果在一个新的activity中只加载了一个fragment,这段代码将无法返回到之前的activity。

0
0 Comments

问题的出现原因:在使用ActionBar的导航功能时,当切换Fragment时,有时候无法正确显示向上导航按钮。

解决方法:

1. 实现OnBackStackChangedListener接口,并在Fragment Activity中添加以下代码:

public void onCreate(Bundle savedInstanceState) {
    // 监听后退栈的变化
    getSupportFragmentManager().addOnBackStackChangedListener(this);
    // 处理Activity重新创建(如屏幕旋转)时的情况
    shouldDisplayHomeUp();
}
public void onBackStackChanged() {
    shouldDisplayHomeUp();
}
public void shouldDisplayHomeUp() {
    // 当后退栈中有条目时,启用向上导航按钮
    boolean canGoBack = getSupportFragmentManager().getBackStackEntryCount() > 0;
    getSupportActionBar().setDisplayHomeAsUpEnabled(canGoBack);
}
public boolean onSupportNavigateUp() {
    // 当向上按钮被按下时,执行后退栈操作
    getSupportFragmentManager().popBackStack();
    return true;
}

2. 注意,如果已经实现了onOptionsItemSelected方法,也可以通过检查itemId为android.R.id.home来实现向上导航,而无需添加onSupportNavigateUp方法。

public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            getSupportFragmentManager().popBackStack();
            return true;
        // 其他菜单项的处理逻辑
    }
    return super.onOptionsItemSelected(item);
}

3. 如果API版本大于等于14,可以使用onNavigateUp代替onSupportNavigateUp。

public boolean onNavigateUp() {
    getFragmentManager().popBackStack();
    return true;
}

4. 注意,在某些情况下,onSupportNavigateUp方法可能不会被调用,可以在onOptionsItemSelected方法中添加后退栈操作,以确保向上导航的正常工作。

5. 如果在实现这些代码后,仍然无法显示向上导航按钮,请确保Activity实现了FragmentManager.OnBackStackChangedListener接口。

以上是关于使用ActionBar在Fragment中实现向上导航的问题的出现原因以及解决方法的整理。

0
0 Comments

问题的出现原因是:在使用ActionBar的上导航功能时,点击返回按钮并不能正确地切换到上一个Fragment。

解决方法是:在宿主Activity中重写onOptionsItemSelected方法,并弹出回退栈。同时,在onBackStackChanged()方法中调用getActionBar().setDisplayHomeAsUpEnabled(boolean)和getActionBar().setHomeButtonEnabled(boolean)来设置ActionBar的显示和功能。在弹出回退栈后,需要调用getActivity().getActionBar().setDisplayHomeAsUpEnabled(false)来移除返回按钮。正确的做法是将以上代码放在switch语句的case android.R.id.home中。

具体示例代码如下:

public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home: {
            FragmentManager fm = getSupportFragmentManager();
            if (fm.getBackStackEntryCount() > 0) {
                fm.popBackStack();
                return true;
            }
            break;
        }
    }
    return super.onOptionsItemSelected(item);
}
public void onBackStackChanged() {
    getActionBar().setDisplayHomeAsUpEnabled(true);
    getActionBar().setHomeButtonEnabled(true);
}
// 在弹出回退栈后,移除返回按钮
getActivity().getActionBar().setDisplayHomeAsUpEnabled(false);

0