アプリに3つのアイテムを持つアクションバーがあります。
スペースの問題のために表示できるのは2つだけなので、最初は表示され、残りはオーバーフローで表示されるはずです。ただし、実際には最初の2つの項目のみが表示され、オーバーフローは検出されません。
関連するコードは次のとおりです。list_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android" >
<item Android:id="@+id/menu_insert"
Android:icon="@Android:drawable/ic_menu_add"
Android:title="@string/menu_insert"
Android:showAsAction="ifRoom|withText"/>
<item Android:id="@+id/menu_call"
Android:icon="@Android:drawable/ic_menu_call"
Android:title="@string/menu_call"
Android:showAsAction="ifRoom|withText"/>
<item Android:id="@+id/menu_agenda"
Android:icon="@Android:drawable/ic_menu_agenda"
Android:title="@string/menu_agenda"
Android:showAsAction="ifRoom|withText"/>
</menu>
Activity.Java
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater mi = getMenuInflater();
mi.inflate(R.menu.list_menu, menu);
return true;
}
デバイスメニューボタンに関係なく、3つのドットを表示したい場合!アプリケーションクラスのonCreateメソッドでこのメソッドを呼び出すことができます。
private void makeActionOverflowMenuShown() {
//devices with hardware menu button (e.g. Samsung Note) don't show action overflow menu
try {
ViewConfiguration config = ViewConfiguration.get(this);
Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
if (menuKeyField != null) {
menuKeyField.setAccessible(true);
menuKeyField.setBoolean(config, false);
}
} catch (Exception e) {
Log.d(TAG, e.getLocalizedMessage());
}
}
res/menu/menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android" >
<!-- Search / will display always -->
<item
Android:id="@+id/action_search"
Android:icon="@drawable/ic_action_search"
Android:showAsAction="always"
Android:title="@string/action_search"/>
<!-- Location Found -->
<item
Android:id="@+id/action_location_found"
Android:icon="@drawable/ic_action_location_found"
Android:showAsAction="always"
Android:title="@string/action_location_found"/>
<!-- More -->
<item
Android:id="@+id/a_More"
Android:icon="@drawable/ic_action_overflow"
Android:showAsAction="always"
Android:title="More">
<menu>
<!-- Refresh -->
<item
Android:id="@+id/action_refresh"
Android:icon="@drawable/ic_action_refresh"
Android:showAsAction="never"
Android:title="@string/action_refresh"/>
<!-- Help -->
<item
Android:id="@+id/action_help"
Android:icon="@drawable/ic_action_help"
Android:showAsAction="never"
Android:title="@string/action_help"/>
<!-- Check updates -->
<item
Android:id="@+id/action_check_updates"
Android:icon="@drawable/ic_action_refresh"
Android:showAsAction="never"
Android:title="@string/action_check_updates"/>
</menu>
</item>
</menu>
MainActivity.Java
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
return super.onCreateOptionsMenu(menu);
}
}
ダウンロード アクションバーアイコンセット
これはオーバーフローメニューではありませんが、似ています。さて、これは簡単ですが、理解するのは困難でした。
最初に、オーバーフローインフレータとして使用するメニュー項目が必要です。例
<item
Android:id="@+id/a_More"
Android:icon="@drawable/more"
Android:showAsAction="always"
Android:title="More">
</item>
アイテムを取得したら、必要なアイテムを含むサブメニューをオーバーフローメニューに追加します。例:
<item
Android:id="@+id/a_More"
Android:icon="@drawable/more"
Android:showAsAction="always"
Android:title="More">
<menu>
<item
Android:id="@+id/aM_Home"
Android:icon="@drawable/home"
Android:title="Home"/>
</menu>
</item>
クリックすると、他のアイテムが膨張します。私のアプリケーションはActionBarSherlock 4.0を使用しているため、これが機能する前に、「SplitActionBar」にアクセスする必要があります。 (デフォルトのAndroid Actionbarでも引き続き機能します)
方法は次のとおりです。AndroidManifest.xmlファイルで、オーバーフローメニューが必要なアクティビティの下にこのコードを追加する必要があります。
Android:uiOptions="splitActionBarWhenNarrow"
注:オーバーフローメニューを拡張するアイテムはshowAsAction="always"
でなければなりません
ヴォーラ!オーバーフローメニューがあります!お役に立てば幸いです。 :)
ハードウェアメニューボタン(Galaxy S3、Samsungは頑固な...)を備えたデバイスでは、ハードウェアメニューボタンを使用することで、オーバーフローメニューは「従来の」メニューとして動作します。
「オーバーフロー」メニューと言うとき、最後に表示される3つの点がアイテムの数が多いことを示しますか?...またはオーバーフローアイテムの下部に表示される分割アクションバーを意味しますか?
分割アクションバーを意味する場合、これをアクティビティのマニフェストファイルに追加する必要があります
Android:uiOptions="splitActionBarWhenNarrow"
デフォルトでは、3つのドットオーバーフローメニューが自動的に表示されるため、上記で提供した情報から問題が何であるかを判断するのは困難です。
Actionbarcompatで常にアクションオーバーフロー(3つのドット)を表示するには:
メニューファイルの例:
main.xml
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto" >
<item
Android:id="@+id/action_settings"
Android:title="@string/action_settings"
app:showAsAction="never"/>
<item
Android:id="@+id/action_about"
Android:title="@string/action_about"
app:showAsAction="never"/>
</menu>
アクティビティファイル内:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return super.onCreateOptionsMenu(menu);
}
私にとってはうまくいきました。
Google Nexus S、Samsung S3でテスト済み。
メニューボタンのあるデバイスでは、オーバーフローメニューがActionBarに表示されないようです。また、デバイスにハードウェアメニューボタンbeforeAPIレベル14 (4.0+)があるかどうかを知る方法もありません。
このソリューションは、Android.support.v7.app.ActionBar
にオーバーフローボタンを追加します。このボタンは、ハニカム以前(<3.0)でのみ標準オプションメニューを開き、それ以外の場合はシステムに残します。いずれの場合でも、すべてのアクションに対してalways
またはifRoom
を選択できます。
Action Bar Icon Pack からオーバーフローアイコンを取得します。
メニューを追加します(タイトル、注文など、関連のない部分は省略します)
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto">
<item
Android:id="@+id/action_overflow"
Android:orderInCategory="100"
Android:icon="@drawable/ic_action_overflow"
app:showAsAction="always" />
<item
Android:id="@+id/action_first"
app:showAsAction="always" />
<item
Android:id="@+id/action_second"
app:showAsAction="ifRoom" />
</menu>
3.0+のオーバーフローアクションを削除する
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
menu.removeItem(R.id.action_overflow);
}
return super.onPrepareOptionsMenu(menu);
}
最後に、オーバーフローアクションからActivity.openOptionsMenu()
を呼び出します。
えー、いや。メニューボタンからopenOptionsMenu()
を呼び出すことはできません...しかし、 AndroidAnnotations を使用している場合は簡単です。
@OptionsItem
void action_overflow() {
openOptionsMenuDeferred();
}
@UiThread
void openOptionsMenuDeferred() {
openOptionsMenu();
}
そうでない場合は、このようなことをする必要があります、私は思う
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == id.action_overflow) {
openOptionsMenuDeferred();
return true;
}
}
private Handler handler = new Handler(Looper.getMainLooper());
public void openOptionsMenuDeferred() {
handler.post(new Runnable() {
@Override
public void run() {
openOptionsMenu();
}
}
);
}
アプリのテーマをTheme.AppCompat.Light.DarkActionBarからTheme.AppCompat.Lightに変更してみてください
メニュータグ内にxmlns:your_app_name="http://schemas.Android.com/apk/res-auto"
を配置し、代わりにAndroid:showAsAction="always"
を使用してyour_app_name:showAsAction="always"
を使用します
例えば
<item
Android:id="@+id/action_search"
Android:icon="@drawable/icon_search"
Android:title="@string/search"
your_app_name:showAsAction="ifRoom"/>