从活动转移到碎片:如何仅为1碎片显示菜单?

时间:2015-01-20 18:09:07

标签: android android-fragments android-menu

我是一名试图从“活动”转移到“片段”的Android编程新手。

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

  1. MainActivity(使用"设置"在菜单中)
  2. 几乎没有复选框和搜索栏的SettingsActivity
  3. 在列表中显示蓝牙设备的ScanningActivity
  4. 这是MainActivity的屏幕截图,右上角有一个省略号菜单:

    main

    我正在尝试将我的应用更改为只有一个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);
    }
    

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

    如何最好地解决这个问题?

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

2 个答案:

答案 0 :(得分:1)

你可以覆盖应该有菜单的片段中的onCreateOptions菜单,并且只在那里充气。

在片段中:

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

答案 1 :(得分:1)

在要显示菜单的片段中使用onCreateOptionsMenu(),而不是在您的活动中。在其他片段中,您不想显示菜单,请使用setHasOptionMenu(false)

要获取当前片段,请使用findFragmentByTag()

中的FragmentManager