2013-06-05 24 views
11

を作成します。いくつかのスペースがに存在する場合Androidは私が下の画像で説明したように設定項目に加えて、私のアクションバーにカスタムオーバーフローメニュー項目を作成するカスタムオーバーフローメニュー項目

Action bar

しかし、 ActionBar私は、Item1とItem2がOverflowとして設定項目に入るのではなく、「私のオーバーフロー項目」に入ることを望んでいます。

これは私のメニューの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> 

答えて

6

これが役に立ちます。私は

<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> 

メニュー/ main.xmlファイルではオーバーフローメニュー

ため これをコード化されていたし、ここにあなたの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;  

} 
+1

ありがとう、しかし android:showAsAction = "always" - > app:showAsAction = "always" – Arnab

0

は、これらのリンク

http://www.codeproject.com/Articles/173121/Android-Menus-My-Way

http://developer.android.com/guide/topics/ui/actionbar.html#Dropdown

を参照してくださいと私はあなたがカスタムオーバーフローメニュー

を作成するためにactionbarsherlockを使用することをお勧め

は、アクションバーシャーロックあなたはおそらくメニューで、すなわち、@ + ID/action_settingsを設定項目を削除する必要が

ActionbarSherlock does not include "overflow" section of Action Bar (on Android 2.1)

+0

ナビゲーションタイプでオーバーフローメニューではないので、外部ライブラリやドロップダウンメニューを使用したくないです。アンドロイド4+のために開発されました。 – lory105

0

を使用してオーバーフローメニュー項目を作成する方法を知っているこの回答を参照してください。

あなたはまだそれはそこになりたい場合は、ちょうどそれが「showAsActionAttribute」だ削除するか、アイテム1とアイテム2について

android:showAsAction="always" 

にそれを交換する: 役立つことandroid:showAsAction="ifRoom|withText"

希望としてのshowAsAction属性を追加します。

0

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

次の手順を実行します。

1)XML RelativeLayout

2)を作成しますが、XML

3)ActionBarクラスを経由してアクションバーを膨らま内部のメニュー項目やタグを含めます。

4)これで完了です!

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

0

アクションバー
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

なぜ、どのようにこの質問に答えられますか?あなたのコードは何をしていますか? – Ben

0

からクリック項目が

<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:<any_damn_name>="http://schemas.android.com/apk/res-auto" 

を追加し、フラグメントおよびグローバル(設定用に別のメニューを持ってしようとすることを忘れないでください

<item .... <any_damn_name>:showAsAction="ifRoom|withText" /> 

を使用してみてくださいGlobal.xmlメニューファイル内)

両方を正しい順序で膨張させてください。

0

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

Menusマニュアルを参照してください。

0

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

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

これはテストされたコードではありません。したがって、実装している間に問題が発生した場合は、お知らせください。