次の画像で説明されているように、設定項目に加えて、アクションバーにカスタムオーバーフローメニュー項目を作成したいと思います。
ただし、ActionBarにスペースがほとんどない場合は、Item1とItem2をオーバーフローとして設定アイテムに入れるのではなく、「オーバーフローアイテム」に入れます。
これは私のメニューxmlコードです:
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item
Android:icon="@Android:drawable/ic_menu_agenda"
Android:title="Item1"
Android:showAsAction="ifRoom|withText" />
<item
Android:icon="@Android:drawable/ic_menu_add"
Android:title="Item2"
Android:showAsAction="ifRoom|withText" />
<item Android:id="@+id/pick_action_provider"
Android:icon="@Android:drawable/ic_menu_sort_by_size"
Android:showAsAction="always"
Android:title="Overflow" >
<menu>
<item Android:id="@+id/action_sort_size"
Android:icon="@Android:drawable/ic_menu_camera"
Android:title="Item3" />
<item Android:id="@+id/action_sort_alpha"
Android:icon="@Android:drawable/ic_menu_sort_alphabetically"
Android:title="Item4" />
</menu>
</item>
<item
Android:id="@+id/action_settings"
Android:orderInCategory="100"
Android:showAsAction="never"
Android:title="@string/action_settings"/></menu>
これはあなたを助けます。オーバーフローメニュー用にこれをコーディングしました
Menu /main.xmlファイル内
<item
Android:id="@+id/overflow"
Android:orderInCategory="100"
Android:showAsAction="always"
Android:icon="@drawable/ic_overflow"
Android:title="">
<menu>
<item
Android:id="@+id/facebook"
Android:title="Facebook"/>
<item
Android:id="@+id/Twitter"
Android:title="Twitter"/>
<item
Android:id="@+id/Youtube"
Android:title="Youtube"/>
</menu>
</item>
そして、ここにあなたのJavaコードがあります:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar actions click
super.onOptionsItemSelected(item);
if(item.getItemId() == R.id.facebook){
Toast.makeText(Getstarted.this, "Option pressed= facebook",Toast.LENGTH_LONG).show();
}
else if(item.getItemId() == R.id.Youtube){
Toast.makeText(Getstarted.this, "Option pressed= youtube",Toast.LENGTH_LONG).show();
}
else if(item.getItemId() == R.id.Twitter){
Toast.makeText(Getstarted.this, "Option pressed= Twitter",Toast.LENGTH_LONG).show();
}
return true;
}
オーバーフローメニューのスタイルを作成し、コンテンツの説明を渡します
<style name="Widget.ActionButton.Overflow" parent="@Android:style/Widget.Holo.ActionButton.Overflow">
<item name="Android:contentDescription">@string/accessibility_overflow</item>
</style>
<style name="Your.Theme" parent="@Android:style/Theme.Holo.Light.DarkActionBar">
<item name="Android:actionOverflowButtonStyle">@style/Widget.ActionButton.Overflow</item>
</style>
ViewGroup.findViewsWithTextを呼び出し、コンテンツの説明を渡します。ややこのように:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// The content description used to locate the overflow button
final String overflowDesc = getString(R.string.accessibility_overflow);
// The top-level window
final ViewGroup decor = (ViewGroup) getWindow().getDecorView();
// Wait a moment to ensure the overflow button can be located
decor.postDelayed(new Runnable() {
@Override
public void run() {
// The List that contains the matching views
final ArrayList<View> outViews = new ArrayList<>();
// Traverse the view-hierarchy and locate the overflow button
decor.findViewsWithText(outViews, overflowDesc,
View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION);
// Guard against any errors
if (outViews.isEmpty()) {
return;
}
// Do something with the view
final ImageButton overflow = (ImageButton) outViews.get(0);
overflow.setImageResource(R.drawable.ic_action_overflow);
}
}, 1000);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Add a dummy item to the overflow menu
menu.add("Overflow");
return super.onCreateOptionsMenu(menu);
}
View.findViewsWithText APIレベル14でのみ追加されました。したがって、次のように独自の方法を実行してみてください。
public static void findViewsWithText(List<View> outViews, ViewGroup parent, String targetDescription) {
if (parent == null || TextUtils.isEmpty(targetDescription)) {
return;
}
final int count = parent.getChildCount();
for (int i = 0; i < count; i++) {
final View child = parent.getChildAt(i);
final CharSequence desc = child.getContentDescription();
if (!TextUtils.isEmpty(desc) && targetDescription.equals(desc.toString())) {
outViews.add(child);
} else if (child instanceof ViewGroup && child.getVisibility() == View.VISIBLE) {
findViewsWithText(outViews, (ViewGroup) child, targetDescription);
}
}
}
これはテスト済みのコードではありません。そのため、実装中に問題が発生した場合はお知らせください。
達成したいことを行う最良の方法は、カスタムActionBar
を膨らませることです。
次の手順を実行します。
1)XMLを作成するRelativeLayout
2)XML内にメニュー項目とタグを含める
3)ActionBar
クラスを介してアクションバーを膨らませます。
4)これで完了です!!
警告:互換性ライブラリを使用することを忘れないでください!!上記が機能するためにいくつかの依存関係があります。
アクションバーからアイテムをクリックしたとき
PopupMenu popup = new PopupMenu(MainActivity.this, v);
popup.getMenuInflater().inflate(
R.mymenu xml , popup.getMenu());
mymenu.xml
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item
Android:icon="@Android:drawable/ic_menu_agenda"
Android:title="Item1"
Android:showAsAction="ifRoom" />
<item
Android:icon="@Android:drawable/ic_menu_add"
Android:title="Item2"
Android:showAsAction="ifRoom" />
<item Android:id="@+id/pick_action_provider"
Android:icon="@Android:drawable/ic_menu_sort_by_size"
Android:showAsAction="ifRoom"
Android:title="Overflow" >
<menu>
<item Android:id="@+id/action_sort_size"
Android:showAsAction="ifRoom|withText"
Android:icon="@Android:drawable/ic_menu_camera"
Android:title="Item3" />
<item Android:id="@+id/action_sort_alpha"
Android:showAsAction="ifRoom|withText"
Android:icon="@Android:drawable/ic_menu_sort_alphabetically"
Android:title="Item4" />
</menu>
</item>
<item
Android:id="@+id/action_settings"
Android:orderInCategory="100"
Android:showAsAction="ifRoom"
Android:title="@string/action_settings"/></menu>
ほとんどの場合、メニューの設定項目、つまり@ + id/action_settingsを削除する必要があります。
それでもそのままにしておきたい場合は、「showAsActionAttribute」を削除するか、次のように交換してください。
Android:showAsAction="always"
Item1およびItem2の場合:showAsAction
属性をAndroid:showAsAction="ifRoom|withText"
として追加します
お役に立てば幸いです。
使ってみてください
<item .... <any_damn_name>:showAsAction="ifRoom|withText" />
追加することを忘れないでください
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android" xmlns:<any_damn_name>="http://schemas.Android.com/apk/res-auto"
そして、フラグメントとグローバルに別々のメニューを用意してみてください(Global.xmlメニューファイルの設定)
両方を正しい順序で膨らませることを確認してください。
menu.xml
:
<item Android:id="@+id/game"
Android:icon="@drawable/menu_addnew"
Android:title="game"
Android:showAsAction="ifRoom"/>
<item Android:id="@+id/help"
Android:icon="@drawable/menu_addnew"
Android:title="help" />
abc.class
ファイルはこれらの変更を行います:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.game_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
switch (item.getItemId()) {
case R.id.game:
Game();
return true;
case R.id.help:
Help();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
メニュー ドキュメントを参照してください。
これらのリンクを参照してください
http://www.codeproject.com/Articles/173121/Android-Menus-My-Way
http://developer.Android.com/guide/topics/ui/actionbar.html#Dropdown
そして、actionbarsherlockを使用してカスタムオーバーフローメニューを作成することをお勧めします
アクションバーシャーロックを使用してオーバーフローメニュー項目を作成する方法については、この回答を参照してください
ActionbarSherlockには、アクションバーの「オーバーフロー」セクションは含まれていません(Android 2.1)