アクションバーにカスタムレイアウトを追加する必要があるアプリケーションを1つ開発しています。カスタムレイアウトの追加は完了しましたが、アクションバーにメニュー項目を追加すると、カスタムレイアウトの位置がアクションバーの右からアクションバーの中央に変わります。以下は私がこれまでに達成したイメージです。
アクションバーにこのようなものが欲しいです。
アクションバーの右側のほとんどの部分と中央のメニュー項目のカスタムレイアウト(黄色のボタン)。
ネイティブAndroid actionbar:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
actionBar = getActionBar();
actionBar.setDisplayShowTitleEnabled(false);
actionBar.setDisplayUseLogoEnabled(false);
actionBar.setDisplayHomeAsUpEnabled(false);
actionBar.setDisplayShowCustomEnabled(true);
cView = getLayoutInflater().inflate(R.layout.header, null);
actionBar.setCustomView(cView);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.websearch_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case Android.R.id.home:
finish();
default:
return super.onOptionsItemSelected(item);
}
}
どうすればこれを達成できますか?
どんな助けでもありがたいです。
カスタムビューをアクションバーのカスタムビューとして設定していると思います。 ActionbarSherlockを使用している場合は、代わりにカスタムビューを通常のメニュー項目として追加し、.setActionView(yourCustomView or yourCustomLayoutId)
を使用してアクションビューを設定できます。次に、.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS)
を設定してビューを表示できます。カスタムビューが幅に設定されていることを確認してくださいwrap_content
またはそれ以外の場合は、他のメニュー項目を画面から押し出します。これはActionbarSherlockがなくても機能する可能性がありますが、まだ試していません。
編集:onCreateOptionsMenu
メソッドを変更してみてください
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.websearch_menu, menu);
// add this
menu.add(Menu.NONE, 0, Menu.NONE, "custom")
.setActionView(R.layout.header)
.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
return true;
}
これをonCreateメソッドから削除します
actionBar.setDisplayShowCustomEnabled(true);
cView = getLayoutInflater().inflate(R.layout.header, null);
actionBar.setCustomView(cView);
編集:
カスタムレイアウトからビューを参照する必要がある場合は、次のようにonCreateOptionsMenu
メソッドでこれを行うことができます(注:このコードはブラウザーで記述したため、タイプミスや何か):
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// inflate the menu and add the item with id viewId,
// which has your layout as actionview
View actionView = menu.getItem(viewId).getActionView();
View viewFromMyLayout = actionView.findViewById(R.id.viewFromMyLayout);
// here you can set listeners to your view or store a reference
// to it somewhere, so you can use it later
return true;
}
XmlファイルでorderInCategory
を使用するだけで、小さい番号から大きい番号(アクションバーの左側)に並べられます。といった:
<item
Android:id="@+id/Refresh"
Android:icon="@drawable/ic_action_refresh"
Android:showAsAction="ifRoom"
Android:title="@string/refresh"
Android:orderInCategory="2"/>
<item
Android:id="@+id/Search"
Android:icon="@drawable/ic_action_action_search"
Android:showAsAction="ifRoom|collapseActionView"
Android:title="@string/search"
Android:orderInCategory="1"/>
Refreshアイテムはxmlファイルで最初に来ますが、最初ではありません。ただし、アクションバーの検索アイコンは、その左から順に、orderInCategory属性に従って最初に表示されます。
メニュー項目の順序は、膨らまされるXMLファイル内の順序に従って設定されます。
したがって、XMLファイル内の順序を好きなように変更するだけで済みます。
これを実現する1つの方法は、 invalidateOptionMen を呼び出し、 onCreateOptionsMen メソッドで、アイテムを希望する順序で配置することです。
ところで、ActionBarSherlockを使用している場合は、このメソッドを使用できるため、Lintに関する警告は無視してください。