Я создаю приложение для Android (минимум SDK Level 10, Gingerbread 2.3.3) с некоторыми фрагментами в ViewPager.Я использую ActionBarSherlock для создания ActionBar и android-viewpagertabs для добавления вкладок в ViewPager, как в клиенте Market.
У меня есть один глобальный пункт менючто я хочу показать на каждой вкладке / фрагмент.На первой из трех вкладок я хочу иметь два дополнительных пункта меню.
Но теперь происходят две странные вещи:
Во-первых, если я запускаю приложение, все вроде бы нормально, я могуувидеть все три пункта меню на первой странице и только один пункт, если я проведу по второй и третьей вкладке.Но если я вернусь ко второй вкладке с третьей, я снова смогу увидеть все три элемента, чего не должно быть.Если я проведу пальцем назад к первой, а затем снова ко второй вкладке, все снова в порядке.
Другая странная вещь заключается в том, что каждый раз, когда я поворачиваю устройство, пункты меню из фрагмента добавляются снова, дажехотя они уже находятся в меню.
Код FragmentActivity, который отображает ViewPager и его вкладки:
public class MainActivity extends FragmentActivity {
public static final String TAG = "MainActivity";
private ActionBar actionBar;
private Adapter adapter;
private ViewPager viewPager;
private ViewPagerTabs tabs;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.volksempfaenger);
actionBar = getSupportActionBar();
adapter = new Adapter(getSupportFragmentManager());
adapter.addFragment(getString(R.string.title_tab_subscriptions),
SubscriptionGridFragment.class);
// adding more fragments here
viewPager = (ViewPager) findViewById(R.id.viewpager);
viewPager.setAdapter(adapter);
tabs = (ViewPagerTabs) findViewById(R.id.tabs);
tabs.setViewPager(viewPager);
}
public static class Adapter extends FragmentPagerAdapter implements
ViewPagerTabProvider {
private FragmentManager fragmentManager;
private ArrayList<Class<? extends Fragment>> fragments;
private ArrayList<String> titles;
public Adapter(FragmentManager fm) {
super(fm);
fragmentManager = fm;
fragments = new ArrayList<Class<? extends Fragment>>();
titles = new ArrayList<String>();
}
public void addFragment(String title, Class<? extends Fragment> fragment) {
titles.add(title);
fragments.add(fragment);
}
@Override
public int getCount() {
return fragments.size();
}
public String getTitle(int position) {
return titles.get(position);
}
@Override
public Fragment getItem(int position) {
try {
return fragments.get(position).newInstance();
} catch (InstantiationException e) {
Log.wtf(TAG, e);
} catch (IllegalAccessException e) {
Log.wtf(TAG, e);
}
return null;
}
@Override
public Object instantiateItem(View container, int position) {
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
Fragment f = getItem(position);
fragmentTransaction.add(container.getId(), f);
fragmentTransaction.commit();
return f;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
BaseActivity.addGlobalMenu(this, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
return BaseActivity.handleGlobalMenu(this, item);
}
}
Код фрагмента, который должен иметь свои собственные пункты меню:
public class SubscriptionGridFragment extends Fragment {
private GridView subscriptionList;
private SubscriptionListAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
// ...
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.subscription_list, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// ...
}
}