Android создать настраиваемый элемент меню переполнения

Я хочу создать элемент пользовательского переполнения в моем ActionBar в дополнение к элементу Setting, как описано на изображении ниже:

Панель действий

Но если в ActionBar немного места, я не хочу, чтобы Item1 и Item2 переходили в элемент Setting как переполнение, но в «элемент переполнения».

Это мое 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> 

Solutions Collecting From Web of "Android создать настраиваемый элемент меню переполнения"

Это поможет вам. Я закодировал это для меню переполнения

В файле 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; } 

Смотрите эти ссылки

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

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

И я предлагаю вам использовать actionbarsherlock для создания настраиваемого меню переполнения

См. Этот ответ, чтобы узнать, как создать элемент меню переполнения с помощью панели действий sherlock

ActionbarSherlock не включает раздел «переполнение» панели действий (на Android 2.1)

Вероятно, вам нужно удалить элемент настройки в меню, т.е. @ + id / action_settings.

Если вы все еще хотите, чтобы он был там, просто удалите его «showAsActionAttribute» или замените его на

 android:showAsAction="always" 

Для Item1 и Item2: добавьте их атрибуты showAsAction как android:showAsAction="ifRoom|withText"

Надеюсь, это поможет.

Лучший способ сделать то, что вы хотите достичь, – раздуть пользовательский ActionBar .

Выполните следующие действия.

1) Создайте XML RelativeLayout

2) Включите пункт меню и тег внутри XML

3) Наполните панель действий через класс ActionBar .

4) Вот и все!

Предупреждение: не забудьте использовать библиотеку совместимости! В нем есть некоторые зависимости, чтобы выше работала.

Когда элемент click на панели действий

 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> 

Попробуйте использовать

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

См. Документацию по меню .

Создайте стиль для меню переполнения и перейдите в описание содержимого

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

Это не проверенный код. Поэтому, если у вас возникнут какие-либо проблемы, сообщите мне об этом.