Как добавить меню опций панели действий в Android Fragments
Я пытаюсь иметь меню опций в Фрагменты Android. ActionBar
меню параметров не отображается в моих фрагментах.
Вот мой код, и у меня есть функция onCreateOptionsMenu()
и onOptionSelected()
. Мой код не показывает никаких ошибок. Но меню параметров не отображается.
package org.reachout;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import org.general.R;
public class ViewMessageFragment extends Fragment {
/* (non-Javadoc)
* @see android.support.v4.app.Fragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle)
*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (container == null) {
// We have different layouts, and in one of them this
// fragment containing frame doesn't exist. The fragment
// may still be created from its saved state, but there is
// no reason to try to create its view hierarchy because it
// won't be displayed. Note this is not needed -- we could
// just run the code below, where we would create and return
// the view hierarchy; it would just never be used.
return null;
}
return (LinearLayout)inflater.inflate(R.layout.viewmessages_tab_fragment_layout, container, false);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
// TODO Auto-generated method stub
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.askexperts_menu, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// handle item selection
switch (item.getItemId()) {
case R.id.action_settings:
// do s.th.
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
Ответы
Ответ 1
Вам нужно позвонить setHasOptionsMenu(true)
в onCreate()
.
Для обратной совместимости лучше разместить этот вызов как можно ближе в конце onCreate()
или даже позже в onActivityCreated()
или что-то в этом роде.
Смотрите: https://developer.android.com/reference/android/app/Fragment.html#setHasOptionsMenu(boolean)
Ответ 2
Я опоздал на ответ, но я думаю, что это еще одно решение, которое не упоминается здесь, поэтому отправляю.
Шаг 1: Сделайте xml меню, которое вы хотите добавить, как будто я должен добавить действие фильтра в свою панель действий, чтобы создать xml filter.xml. Основная строка, которую следует отметить, - android: orderInCategory, это покажет значок действия в начале или в конце, где бы вы ни хотели показывать. Еще одна вещь, которую нужно отметить, - это значение, если значение меньше, чем оно будет отображаться вначале, а если значение больше, то оно будет отображаться последним.
filter.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" >
<item
android:id="@+id/action_filter"
android:title="@string/filter"
android:orderInCategory="10"
android:icon="@drawable/filter"
app:showAsAction="ifRoom" />
</menu>
Шаг 2: В onCreate() метод фрагмента просто поместил нижеприведенную строку, как указано, что отвечает за вызов onCreateOptionsMenu (меню меню, MenuInflater надуватель), как в Деятельности.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
Шаг 3: Теперь добавьте метод onCreateOptionsMenu, который будет переопределяться как:
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.filter, menu); // Use filter.xml from step 1
}
Шаг 4: Теперь добавьте метод onOptionsItemSelected, с помощью которого вы можете реализовать логику, что бы вы ни делали, когда вы выбираете значок добавленного действия из actionBar:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if(id == R.id.action_filter){
//Do whatever you want to do
return true;
}
return super.onOptionsItemSelected(item);
}
Ответ 3
в AndroidManifest.xml задайте тему голо, как это:
<activity
android:name="your Fragment or activity"
android:label="@string/xxxxxx"
android:theme="@android:style/Theme.Holo" >