web-dev-qa-db-ja.com

アクションバーのメニュー項目の位置を変更する方法

アクションバーにカスタムレイアウトを追加する必要があるアプリケーションを1つ開発しています。カスタムレイアウトの追加は完了しましたが、アクションバーにメニュー項目を追加すると、カスタムレイアウトの位置がアクションバーの右からアクションバーの中央に変わります。以下は私がこれまでに達成したイメージです。

Done till here

アクションバーにこのようなものが欲しいです。

Like this

アクションバーの右側のほとんどの部分と中央のメニュー項目のカスタムレイアウト(黄色のボタン)。

ネイティブ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);
    }
}

どうすればこれを達成できますか?

どんな助けでもありがたいです。

14
Anupam

カスタムビューをアクションバーのカスタムビューとして設定していると思います。 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;
}
3
Thrakbad

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属性に従って最初に表示されます。

14
Rashid

メニュー項目の順序は、膨らまされるXMLファイル内の順序に従って設定されます。

したがって、XMLファイル内の順序を好きなように変更するだけで済みます。

2
oznus

これを実現する1つの方法は、 invalidateOptionMen を呼び出し、 onCreateOptionsMen メソッドで、アイテムを希望する順序で配置することです。

ところで、ActionBarSherlockを使用している場合は、このメソッドを使用できるため、Lintに関する警告は無視してください。

0