从 Activities 转移到 Fragments:如何只显示 1 个 Fragment 的菜单?
Moving from Activities to Fragments: how to display the menu just for 1 Fragment?
我是一名 Android 编程新手,正试图从 Activity 转向 Fragments。
我有一个包含 3 个活动的简单蓝牙应用程序:
- MainActivity(菜单中有 "Settings")
- 带有几个复选框和搜索栏的 SettingsActivity
- 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()
我是一名 Android 编程新手,正试图从 Activity 转向 Fragments。
我有一个包含 3 个活动的简单蓝牙应用程序:
- MainActivity(菜单中有 "Settings")
- 带有几个复选框和搜索栏的 SettingsActivity
- 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()