Меню настроек Android во фрагменте - PullRequest
370 голосов
/ 29 ноября 2011

Я пытаюсь добавить элемент в меню параметров из группы фрагментов.

Я создал новый класс MenuFragment и расширил его для фрагментов, в которые я хочу включить элемент меню.Вот код:

public class MenuFragment extends Fragment {

    MenuItem fav;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
    }

    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        fav = menu.add("add");
        fav.setIcon(R.drawable.btn_star_big_off);
    }
}

По какой-то причине onCreateOptionsMenu не работает.

Ответы [ 19 ]

3 голосов
/ 26 сентября 2017

Ваш код в порядке.В методе отсутствовало только супер:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    // TODO add your menu : 
    inflater.inflate(R.menu.my_menu, menu);
    //TODO call super
    super.onCreateOptionsMenu(menu, inflater);
}
3 голосов
/ 21 ноября 2015

Файл меню:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/play"
        android:titleCondensed="Speak"
        android:showAsAction="always"
        android:title="Speak"
        android:icon="@drawable/ic_play">
    </item>
    <item
        android:id="@+id/pause"
        android:titleCondensed="Stop"
        android:title="Stop"
        android:showAsAction="always"
        android:icon="@drawable/ic_pause">
    </item>
</menu>

Код активности:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.speak_menu_history, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {

        case R.id.play:
            Toast.makeText(getApplicationContext(), "speaking....", Toast.LENGTH_LONG).show();
            return false;

        case R.id.pause:
            Toast.makeText(getApplicationContext(), "stopping....", Toast.LENGTH_LONG).show();
            return false;

        default:
            break;
    }

    return false;
}

Код фрагмента:

@Override

public void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {

        case R.id.play:
            text = page.getText().toString();
            speakOut(text);

            // Do Activity menu item stuff here
            return true;

        case R.id.pause:
            speakOf();

            // Not implemented here
            return true;

        default:
            break;
    }
    return false;
}
2 голосов
/ 24 января 2018

Я сходил с ума, потому что ни один из ответов здесь не работал для меня.

Чтобы показать меню, мне нужно было позвонить: setSupportActionBar(toolbar)

Готово!

Примечание: если ваше представление toolbar не в том же макете активности, вы не можете использовать вышеуказанный вызов непосредственно из вашего класса активности, в этом случае вам нужно получить это действие из вашего класса фрагмента, а затем позвоните setSupportActionBar(toolbar). Помните: ваш класс активности должен расширять AppCompatActivity.

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

1 голос
/ 23 октября 2015

Я бы добавил к этому одну вещь и причину, по которой она не работает для меня.

Это похоже на ответ Напстера.

  1. Убедитесь, чтохостинг вашего фрагмента распространяется AppCompatActivity, а не FragmentActivity!

    public class MainActivity extends AppCompatActivity {
    
    }
    

    Из справочника Google Документация для FragmentActivity:

    Примечание: Если вы хотите реализовать действие, которое включает в себя панель действий, вам следует вместо этого использовать класс ActionBarActivity, который является его подклассом, поэтому он позволяет использовать API-интерфейсы фрагментов на уровне API 7 и выше.

  2. Чтобы обновить ответ Napster - ActionBarActivity сейчас считается устаревшим, вместо него используйте AppCompatActivity.

  3. При использовании AppCompatActivity также убедитесь, что выустановите "тему деятельности на Theme.AppCompat или подобную тему" (Google Doc).

Примечание: android.support.v7.app.AppCompatActivity является подклассом класса android.support.v4.app.FragmentActivity (см. AppCompatActivity ref doc).

1 голос
/ 10 сентября 2016

В папке вашего меню создайте XML-файл .menu и добавьте этот xml

<item
    android:id="@+id/action_search"
    android:icon="@android:drawable/ic_menu_search"
    android:title="@string/action_search"
    app:actionViewClass="android.support.v7.widget.SearchView"
    app:showAsAction="always|collapseActionView" />

В вашем фрагменте класса overide этот метод и

implement SearchView.OnQueryTextListener    in your fragment class



@Override
 public void onViewCreated(View view, Bundle savedInstanceState) {    
  super.onViewCreated(view, savedInstanceState);
  setHasOptionsMenu(true);

}

Теперь просто настройте xml-файл меню в классе фрагментов

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.menu_main, menu);

    final MenuItem item = menu.findItem(R.id.action_search);
    final SearchView searchView = (SearchView)    
    MenuItemCompat.getActionView(item);


    MenuItemCompat.setOnActionExpandListener(item,
            new MenuItemCompat.OnActionExpandListener() {
                @Override
                public boolean onMenuItemActionCollapse(MenuItem item) {
                    // Do something when collapsed

                    return true; // Return true to collapse action view
                }

                @Override
                public boolean onMenuItemActionExpand(MenuItem item) {
                    // Do something when expanded
                    return true; // Return true to expand action view
                }
            });

}
1 голос
/ 19 апреля 2015

Моя проблема была немного другой. Я все сделал правильно. Но я унаследовал неправильный класс для действия, в котором размещен фрагмент.

Для ясности, если вы переопределяете onCreateOptionsMenu(Menu menu, MenuInflater inflater) во фрагменте, убедитесь, что ваш класс активности, в котором находится этот фрагмент, наследует android.support.v7.app.ActionBarActivity (на случай, если вы захотите поддерживать ниже уровня API 11).

Я унаследовал android.support.v4.app.FragmentActivity для поддержки уровня API ниже 11.

1 голос
/ 08 ноября 2014

Настройка меню параметров после создания фрагмента работала хорошо для меня.

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    setHasOptionsMenu(true);        
}
0 голосов
/ 19 мая 2017

для вашего onCreate метода add setHasOptionMenu ()

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

Затем переопределение ваше onCreateOptionsMenu

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    menu.add("Menu item")
            .setIcon(android.R.drawable.ic_delete)
            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
}
0 голосов
/ 23 мая 2016

Если все вышеперечисленное не работает, вам нужно отладить и убедиться, что функция onCreateOptionsMenu была вызвана (путем размещения журнала отладки или записи ...)

Если он не запущен, возможно, ваша тема Androidне поддерживает панель действий. Откройте AndroidManifest.xml и установите значение для android:theme с панелью действий поддержки тем :

 <activity
     android:name=".MainActivity"
     android:label="@string/app_name"
     android:theme="@style/Theme.AppCompat">
...