Fragment 的 onCreateOptionsMenu 方法从未被调用
Fragment's onCreateOptionsMenu method is never called
我有一个包含两个活动托管片段的应用程序。我的主要 activity 托管一个片段,该片段能够定义和扩充工具栏中的菜单,没问题。
虽然在第二个 activity 中使用 FragmentStatePagerAdapter
允许在项目之间水平滚动,但我的片段似乎无法定义工具栏中的菜单。
支票:
- 我的整个应用程序设置为使用 a theme (
android:theme="@style/AppTheme"
) based on Theme.AppCompat.Light.DarkActionBar
。
- 我的片段扩展
android.support.v4.app.Fragment
setHasOptionsMenu(true);
是 called 来自片段的 onCreate()
方法
- hosting activity 扩展
AppCompatActivity
并且本身不实现工具栏菜单
- 我的片段overrides
void onCreateOptionsMenu(Menu, MenuInflater)
,但是这个方法好像从来没有被调用过
You can have a look at the commit that is supposed to add that menu on GitHub.(甚至查看可能导致错误的代码的任何部分。)
以下是大行:
CrimeFragment.java
:
public class CrimeFragment extends Fragment {
// ...
@Override
public void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "onCreate()");
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
UUID id = (UUID) getArguments().getSerializable(ARG_CRIME_ID);
Log.d(TAG, String.format("Crime id in intent's extra: %s", id.toString()));
mCrime = CrimeLab.get(getActivity()).getCrime(id);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
Log.d(TAG, "onCreateOptionsMenu()"); // <= Never shows in the Android Monitor
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.fragment_crime, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_item_delete_crime:
CrimeLab.get(getActivity()).deleteCrime(mCrime);
getActivity().finish();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
// ...
}
我这里有什么地方做错了吗?
好吧,花了我一些时间,但我终于找到了我的代码有什么问题。这有点棘手。
在主机 activity 中的一个 earlier change, I overrode FragmentStatePagerAdapter#setPrimaryItem()
中,以便每次用户在页面之间切换时得到通知。
不幸的是,在那个重写中,我忘记调用 super
,显然这就是混淆应用程序的原因。
我不得不 add that call to super
,我的菜单项突然开始出现。
public class CrimePagerActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_crime_pager);
// ...
FragmentManager fragmentManager = getSupportFragmentManager();
mViewPager.setAdapter(new FragmentStatePagerAdapter(fragmentManager) {
// ...
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
super.setPrimaryItem(container, position, object); // <= This line was missing
Crime crime = mCrimes.get(position);
mChangedCrimeIds.add(crime.getId());
}
});
mViewPager.setCurrentItem(CrimeLab.get(this).getPosition(crimeId));
}
// ...
}
我有一个包含两个活动托管片段的应用程序。我的主要 activity 托管一个片段,该片段能够定义和扩充工具栏中的菜单,没问题。
虽然在第二个 activity 中使用 FragmentStatePagerAdapter
允许在项目之间水平滚动,但我的片段似乎无法定义工具栏中的菜单。
支票:
- 我的整个应用程序设置为使用 a theme (
android:theme="@style/AppTheme"
) based onTheme.AppCompat.Light.DarkActionBar
。 - 我的片段扩展
android.support.v4.app.Fragment
setHasOptionsMenu(true);
是 called 来自片段的onCreate()
方法- hosting activity 扩展
AppCompatActivity
并且本身不实现工具栏菜单 - 我的片段overrides
void onCreateOptionsMenu(Menu, MenuInflater)
,但是这个方法好像从来没有被调用过
You can have a look at the commit that is supposed to add that menu on GitHub.(甚至查看可能导致错误的代码的任何部分。)
以下是大行:
CrimeFragment.java
:
public class CrimeFragment extends Fragment {
// ...
@Override
public void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "onCreate()");
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
UUID id = (UUID) getArguments().getSerializable(ARG_CRIME_ID);
Log.d(TAG, String.format("Crime id in intent's extra: %s", id.toString()));
mCrime = CrimeLab.get(getActivity()).getCrime(id);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
Log.d(TAG, "onCreateOptionsMenu()"); // <= Never shows in the Android Monitor
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.fragment_crime, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_item_delete_crime:
CrimeLab.get(getActivity()).deleteCrime(mCrime);
getActivity().finish();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
// ...
}
我这里有什么地方做错了吗?
好吧,花了我一些时间,但我终于找到了我的代码有什么问题。这有点棘手。
在主机 activity 中的一个 earlier change, I overrode FragmentStatePagerAdapter#setPrimaryItem()
中,以便每次用户在页面之间切换时得到通知。
不幸的是,在那个重写中,我忘记调用 super
,显然这就是混淆应用程序的原因。
我不得不 add that call to super
,我的菜单项突然开始出现。
public class CrimePagerActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_crime_pager);
// ...
FragmentManager fragmentManager = getSupportFragmentManager();
mViewPager.setAdapter(new FragmentStatePagerAdapter(fragmentManager) {
// ...
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
super.setPrimaryItem(container, position, object); // <= This line was missing
Crime crime = mCrimes.get(position);
mChangedCrimeIds.add(crime.getId());
}
});
mViewPager.setCurrentItem(CrimeLab.get(this).getPosition(crimeId));
}
// ...
}