这是我创建的一个简单的Android应用程序来演示我的问题:
public class OptionMenuTest extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("test", "create activity");
setContentView(R.layout.options_layout);
if(getFragmentManager().findFragmentByTag("frag") == null) {
getFragmentManager().beginTransaction().add(R.id.option_fragment_container, new OptionMenuFragment(), "frag").commit();
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
Log.d("test", "saving Activity state");
super.onSaveInstanceState(outState);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
Log.d("test", "create Activity options menu");
menu.add("activity");
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
分段:
public class OptionMenuFragment extends Fragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("test", "create fragment");
setHasOptionsMenu(true);
}
@Override
public View onCreateView(LayoutInflater inflater, …Run Code Online (Sandbox Code Playgroud) 我无法onPrepareOptionsMenu()正常工作.无论我尝试什么,我都无法得到它.
我的应用程序的体系结构如下:我的主Activity包含一个包含ViewPager的Fragment,而ViewPager又有四个子Fragment实例.目前,我(已成功)填充Activity with中的初始选项菜单onCreateOptionsMenu(),但我希望添加一些与每个活动子Fragment相对应的额外选项.
在我的孩子片段中,我已经确定setHasOptionsMenu(true)正在调用它onCreate()并且getSherlockActivity().supportInvalidateOptionsMenu()被调用onActivityCreated().在主Activity中,onCreateOptionsMenu()在实例化子Fragment之后调用一次,无论它们是否包含supportInvalidateOptionsMenu().随后在寻呼机中的片段被替换时再次调用它.
我已经尝试将onPrepareOptionsMenu()代码向上移动到父片段和主要活动 - 无济于事,这表明问题与我使用嵌套片段无关.我也尝试将onCreateOptionsMenu()方法从主Activity移动到两个片段,在那里它不被调用.
如果有人知道这里发生了什么,我会非常感激,因为我已经被困在这两天了.
更新 - 我已经确切地解决了现在的问题,只是我仍然不确定如何解决它.我正在测试4.2,它似乎在Activity 中onCreateOptionsMenu()被调用onResume()- 如在JB 4.2上的onResume之后调用的onCreateOptionsMenu中所示.我认为这意味着片段无法调用,onPrepareOptionsMenu()因为菜单在实例化后才会存在.那么我该如何解决这个问题呢?
android android-optionsmenu android-viewpager actionbarsherlock
android ×2