web-dev-qa-db-ja.com

Androidカスタムオーバーフローメニュー項目を作成する

次の画像で説明されているように、設定項目に加えて、アクションバーにカスタムオーバーフローメニュー項目を作成したいと思います。

Action bar

ただし、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>
12
lory105

これはあなたを助けます。オーバーフローメニュー用にこれをコーディングしました

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;    

}
7

オーバーフローメニューのスタイルを作成し、コンテンツの説明を渡します

<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);
        }
    }
}

これはテスト済みのコードではありません。そのため、実装中に問題が発生した場合はお知らせください。

0
RIJO RV

達成したいことを行う最良の方法は、カスタムActionBarを膨らませることです。

次の手順を実行します。

1)XMLを作成するRelativeLayout

2)XML内にメニュー項目とタグを含める

3)ActionBarクラスを介してアクションバーを膨らませます。

4)これで完了です!!

警告:互換性ライブラリを使用することを忘れないでください!!上記が機能するためにいくつかの依存関係があります。

0
Parth Sane

アクションバーからアイテムをクリックしたとき

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>
0
manish jain

ほとんどの場合、メニューの設定項目、つまり@ + id/action_settingsを削除する必要があります。

それでもそのままにしておきたい場合は、「showAsActionAttribute」を削除するか、次のように交換してください。

Android:showAsAction="always"

Item1およびItem2の場合:showAsAction属性をAndroid:showAsAction="ifRoom|withText"として追加します

お役に立てば幸いです。

0
Edward Quixote

使ってみてください

<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メニューファイルの設定)

両方を正しい順序で膨らませることを確認してください。

0
andoidbaby

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);
    }
}

メニュー ドキュメントを参照してください。

0
amit sharma

これらのリンクを参照してください

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)

0
Shruti