为ActionBarCompat中的片段调用setDisplayHomeAsUpEnabled

时间:2014-02-02 17:37:34

标签: android android-fragments android-actionbar-compat

我正在使用ActionBarCompat。当我加载子片段时,我希望主页按钮作为向上按钮。所以我从子片段中调用了这个:

((ActionBarActivity) getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);

但仍然没有将主页按钮显示为向上按钮。我还为android.R.id.home中的ID onOptionsItemSelected添加了逻辑,但它仍然不起作用。我有什么想法可以完成它吗?

5 个答案:

答案 0 :(得分:8)

我已经挣扎了好几天,这就是我发现的工作。我希望有更好的解决方案,但这确实可以完成工作:

在我的主要活动(启动片段的活动)中,创建以下公共函数,该函数将由" child"片段:

// The method is in MainActivity.java
public void resetActionBar(boolean childAction, int drawerMode)
{
    if (childAction) {
        // [Undocumented?] trick to get up button icon to show
        drawerToggle.setDrawerIndicatorEnabled(false);
        mActionBar.setDisplayHomeAsUpEnabled(true);
    } else {
        drawerToggle.setDrawerIndicatorEnabled(true);
    }

    drawerLayout.setDrawerLockMode(drawerMode);
}

然后,从您想要显示“向上”按钮的片段中,只需按如下方式调用该方法(根据需要调整类名):

// This method in in SomeFragment.java
((MainActivity)getActivity()).resetActionBar(true,
      DrawerLayout.LOCK_MODE_LOCKED_CLOSED);

总结一下,以下是如何从片段启用按钮:

  • 禁用drawerToggle对象上的抽屉指示器 - 调用setDrawerIndicatorEnabled(false)
  • 设置displayHomeAsUp - 在actionBar对象上调用setDisplayHomeAsUpEnable(true)
  • 可选择锁定抽屉,使其不会出现在边缘滑动

希望这会有所帮助,我希望将来这会变得更容易......

答案 1 :(得分:1)

参加派对迟到了:)

我正在分享这个,以便它可以帮助某人。我已经掌握了许多解决方案,但没有一个能够完美运行。我已经使用了我的项目中可用的解决方案的变体,如下所示。请在初始化工具栏和抽屉布局的类中使用此代码。

getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
                drawerFragment.mDrawerToggle.setDrawerIndicatorEnabled(false);
                getSupportActionBar().setDisplayHomeAsUpEnabled(true);// show back button
                toolbar.setNavigationOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        onBackPressed();
                    }
                });
            } else {
                //show hamburger
                drawerFragment.mDrawerToggle.setDrawerIndicatorEnabled(true);
                getSupportActionBar().setDisplayHomeAsUpEnabled(false);
                drawerFragment.mDrawerToggle.syncState();
                toolbar.setNavigationOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        drawerFragment.mDrawerLayout.openDrawer(GravityCompat.START);
                    }
                });
            }
        }
    });

答案 2 :(得分:0)

我引用了答案并进行了这样的更改:

//add third parameter for Fragment
    public void resetActionBar(boolean childAction, int drawerMode , final Fragment fragment) {
        if (childAction) {
            // [Undocumented?] trick to get up button icon to show
            actionBarDrawerToggle.setDrawerIndicatorEnabled(false);
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            toolbar.setNavigationOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    FragmentManager manager = getSupportFragmentManager();
                    FragmentTransaction transaction = manager.beginTransaction();
                    transaction.replace(R.id.mainFrame, fragment);
                    transaction.commit();
                }
            });
        } else {
            actionBarDrawerToggle.setDrawerIndicatorEnabled(true);
        }
        drawerLayout.setDrawerLockMode(drawerMode);
    }

我在其他片段中调用此函数,如下所示:

//new Homepage it's my one of fragments , you can pick up your destination
    ((MainActivity) getActivity()).resetActionBar(true,DrawerLayout.LOCK_MODE_LOCKED_CLOSED,new HomePage());

我仍然对生活圈问题感到困惑,这对你有帮助。

答案 3 :(得分:0)

class ABC : Fragment()  {
    override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? { {

        (activity as MainActivity).supportActionBar?.setDisplayHomeAsUpEnabled(false)
    }
}

答案 4 :(得分:-2)

试试这个,也不要忘记提及清单

中活动的父活动和元数据
public boolean onOptionsItemSelected(MenuItem item) {

    if (item.getItemId() == android.R.id.home) {

        Intent intent = NavUtils.getParentActivityIntent(this);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        NavUtils.navigateUpTo(this, intent);
        // NavUtils.navigateUpFromSameTask(this);
        // finish();
        return true;
    } else {
        return super.onOptionsItemSelected(item);
    }
}