从 Activities 转移到 Fragments:如何只显示 1 个 Fragment 的菜单?

Moving from Activities to Fragments: how to display the menu just for 1 Fragment?

我是一名 Android 编程新手,正试图从 Activity 转向 Fragments。

我有一个包含 3 个活动的简单蓝牙应用程序:

  1. MainActivity(菜单中有 "Settings")
  2. 带有几个复选框和搜索栏的 SettingsActivity
  3. ScanningActivity 在列表中显示蓝牙设备

这是 MainActivity 的屏幕截图,top-right 角有一个省略号菜单:

我正在尝试将我的应用更改为具有单个 MainActivity,它显示 3 个片段之一(MainFragment、SettingsFragment 或 ScanningFragment):

public class MainActivity extends Activity implements 
                        MainListener, /* my 3 custom interfaces */
                        SettingsListener, 
                        ScanningListener, 
                        BleWrapperUiCallbacks {

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main); // empty FrameLayout

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

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        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);
}

我的问题 是目前总是显示 "Settings" 菜单 - 而我只需要在显示 MainFragment 时显示它(而不是在 SettingsFragment 或 ScanningFragment 时已显示)。

这个怎么解决最好?

我是否必须引入一个枚举变量,我可以查询它以查找当前显示的是 3 个片段中的哪一个,或者有更好的方法吗?

您可以在应该有菜单的片段中覆盖 onCreateOptions 菜单,并且只在那里展开它。

片段中:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater){
     super.onCreateOptionsMenu(menu, inflater);
     inflater.inflate(R.menu.your_fragment_menu);
}

在您希望显示菜单的片段中使用 onCreateOptionsMenu(),而不是在您的 activity 中。在您不想显示菜单的其他片段中,使用 setHasOptionMenu(false).

要获取当前片段,请使用 FragmentManager

中的 findFragmentByTag()