私のプロジェクトでは、actionbarsherlock を使用して上部にコンテキスト メニューを表示し、タブホストを使用して下部に移動オプションを表示します (各タブはフラグメントを読み込みます)。
最初、私のデフォルトのタブは、ユーザーの GPS 位置を取得してマップをロードするタブでした。2 番目のタブは、いくつかのカテゴリ オプションを含むリストでした。このタブを交換することにしたので (TabsAdapter で最初にカテゴリ タブを追加するだけで)、アクションバーの変更に問題が発生し始めました。
アプリを最初に起動すると、タイトルの代わりに、「カテゴリ リスト」フラグメントからこの「カテゴリを選択」スピナーが表示されます。MainActivity で ViewPager.OnPageChangeListener を実装して修正しましたが、ユーザーがタブを変更したときにのみ呼び出されるため、カテゴリ フラグメントが最初に表示されたときにスピナーを削除するだけでは十分ではありません。
以下にいくつかのコードを貼り付けました。
- - 主な活動 - - -
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTitle("");
setContentView(R.layout.activity_main);
mTabHost = (TabHost)findViewById(android.R.id.tabhost);
mTabHost.setup();
mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setOnPageChangeListener(this);
mTabsAdapter = new TabsAdapter(this, mTabHost, mViewPager);
mTabsAdapter.addTab(mTabHost.newTabSpec("Por Perto").setIndicator(prepareTabView("Categorias",R.drawable.maisapp)), CategoriasLista.class, null);
mTabsAdapter.addTab(mTabHost.newTabSpec("Categorias").setIndicator(prepareTabView("Por Perto",R.drawable.por_perto)), PorPertoFragment.class, null);
mTabsAdapter.addTab(mTabHost.newTabSpec("Baixados").setIndicator(prepareTabView("Baixados",R.drawable.cupons)), BaixadosFragment.class, null);
mTabsAdapter.addTab(mTabHost.newTabSpec("Sobre").setIndicator(prepareTabView("Configurações",R.drawable.setup)), ConfiguracoesFragment.class, null);
if (savedInstanceState != null) {
mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab"));
}
}
//This method gets called whenever user changes tab
public void onPageSelected(int position) {
supportInvalidateOptionsMenu();
if (position != 1) {
com.actionbarsherlock.app.ActionBar bar = getSupportActionBar();
bar.setNavigationMode(com.actionbarsherlock.app.ActionBar.NAVIGATION_MODE_STANDARD);
//bar.setDisplayShowTitleEnabled(false);
switch (position){ //Seta a title da action bar conforme a viewpager TODO nao funcionou
case 0:
setTitle("Categorias");
break;
case 2:
setTitle("Baixados");
break;
case 3:
setTitle("Configurações");
break;
}
} else {
com.actionbarsherlock.app.ActionBar bar = getSupportActionBar();
bar.setNavigationMode(com.actionbarsherlock.app.ActionBar.NAVIGATION_MODE_LIST);
setTitle("");
}
}
-----CategoriasLista (カテゴリフラグメント)------
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.categorias_lista, null);
setHasOptionsMenu(true);
adapter = new CategoriasListaAdapter(getActivity().getApplicationContext());
ListView list = (ListView)v.findViewById(R.id.catList);
list.setAdapter(adapter);
list.setOnItemClickListener(this);
return v;
}
--------PorPertoFragment (マップフラグメント)--------
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View v = inflater.inflate(R.layout.por_perto_fragment, null);
buscarButton = (Button) v.findViewById(R.id.buscar);
loadingLayout = (RelativeLayout) v.findViewById(R.id.loadingLayout);
ActionBar bar = getSherlockActivity().getSupportActionBar();
getSherlockActivity().supportInvalidateOptionsMenu();
ArrayAdapter mSpinnerAdapter = ArrayAdapter.createFromResource(getActivity(), R.array.action_list,
R.layout.sherlock_spinner_item);
mSpinnerAdapter.setDropDownViewResource(R.layout.spinner_item);
ActionBar.OnNavigationListener mOnNavigationListener = new ActionBar.OnNavigationListener() {
// Get the samfre strings provided for the drop-down's ArrayAdapter
String[] strings = getResources().getStringArray(R.array.action_list);
@Override
public boolean onNavigationItemSelected(int position, long itemId) {
selectedCategory = position;
if (mNaviFirstHit) {
mNaviFirstHit = false;
return true;
}
//IMPORTANT: avoids Nullexception.
if (mMap != null)
downloadJson();
return true;
}
};
bar.setNavigationMode(bar.NAVIGATION_MODE_LIST);
bar.setListNavigationCallbacks(mSpinnerAdapter, mOnNavigationListener);
bar.setSelectedNavigationItem(selectedCategory);
return v;
}
これをどのように処理できますか?前もって感謝します。
[編集] onPrepareOptionsMenu をオーバーライドすることが、それを達成するための良い方法になる可能性があることがわかりました。それは有望に見えますが、私は各フラグメントでそれを行いました.カテゴリフラグメントの最初の出現を修正する仕事をしましたが、このメソッドは他のフラグメントが選択されたときに呼び出されません...私はそれを次のようにコーディングしました下:
@Override
public void onPrepareOptionsMenu(Menu menu){
super.onPrepareOptionsMenu(menu);
Log.e("CategoriasLista", "Executou onPrepareOptionsMenu");
ActionBar bar = getSherlockActivity().getSupportActionBar();
getSherlockActivity().supportInvalidateOptionsMenu();
bar.setNavigationMode(com.actionbarsherlock.app.ActionBar.NAVIGATION_MODE_STANDARD);
bar.setTitle("Categorias");
}
[/編集]