如何隐藏顶部 Fragment 中的 "Up button" 并在其他 Fragment 中显示?

How to hide the "Up button" in the top Fragment and show it in other Fragments?

在与蓝牙相关的应用程序中(带有 minSdkVersion="18")我有一个 MainActivity.java,显示以下 3 个之一 UI片段:

要显示 "Up button" 并处理 "Back button" 我有以下代码:

public class MainActivity extends Activity 
                          implements BleWrapperUiCallbacks {

    // set in onResume() of each fragment
    private Fragment mActiveFragment = null;

´   @Override
    public void onBackPressed() {
        if (!getFragmentManager().popBackStackImmediate())
            super.onBackPressed();
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_ACTION_BAR);
        setContentView(R.layout.activity_root);
        getActionBar().setDisplayHomeAsUpEnabled(true);

        if (savedInstanceState == null) {
            Fragment fragment = new MainFragment();
            getFragmentManager().beginTransaction()
                .replace(R.id.root, fragment, "main")
                .commit();
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                getFragmentManager().popBackStackImmediate();
                break;

            case R.id.action_settings:
                Fragment fragment = new SettingsFragment();
                getFragmentManager().beginTransaction()
                    .addToBackStack(null)
                    .replace(R.id.root, fragment, "settings")
                    .commit();
                break;
        }

        return super.onOptionsItemSelected(item);
    }

这很好用,但有一个外观问题,即在显示 MainFragment.java 时仍然显示 "Up button" - 如您所见在上面屏幕截图的左侧。

我试过打电话给

getActionBar().setHomeButtonEnabled(false);

当该片段处于活动状态时,但这只会禁用 "Up button" - 而不会真正隐藏它。

你很幸运,因为在 API 级别 18 中有这个:

getActionBar().setHomeAsUpIndicator(R.drawable.ic_yourindicator);  

对于支持库,它是:

getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_yourindicator);  

所以现在根据您所在的片段,您可以更改 "up" 按钮的图标。

另外,试试这个:

getActionBar().setDisplayHomeAsUpEnabled(false);

Set whether home should be displayed as an "up" affordance.

在 Little Child 的帮助下(谢谢!)我的解决方案使用 FragmentManager.OnBackStackChangedListener:

public class MainActivity extends Activity 
                          implements OnBackStackChangedListener,
                                    BleWrapperUiCallbacks {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        ...
        getFragmentManager().addOnBackStackChangedListener(this);
    }

    @Override
    public void onBackStackChanged() {
        getActionBar().setDisplayHomeAsUpEnabled(
            getFragmentManager().getBackStackEntryCount() > 0);
    }

2021 工作解决方案:

(requireActivity() as AppCompatActivity).supportActionBar?.setHomeAsUpIndicator(null)