Подтвердить что ты не робот

Android - Как получить доступ к элементам меню панели действий в классе фрагментов

Как мне получить доступ к элементам меню панели действий в фрагменте? Я пробовал это, но ничего не произошло

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // TODO Auto-generated method stub

    switch (item.getItemId()) {
    case R.id.menu_refresh:
        Toast.makeText(getActivity().getApplicationContext(), "clicked", Toast.LENGTH_SHORT).show();
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    // TODO Auto-generated method stub
    super.onCreateOptionsMenu(menu, inflater);
}
4b9b3361

Ответ 1

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

  • Добавьте в свой фрагмент метод setHasOptionsMenu (true).

  • Переопределить onCreateOptionsMenu (меню меню, надувной элемент MenuInflater) и onOptionsItemSelected (MenuItem item) в вашем фрагменте.

  • Внутри вашего onOptionsItemSelected (элемент MenuItem) Способ активности, убедитесь, что вы вернете false, когда действие пункта меню будет реализовано в onOptionsItemSelected (элемент MenuItem) Фрагмент Метод.

Пример:

активность

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

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.activity_menu_item:
        // Do Activity menu item stuff here
        return true;
    case R.id.fragment_menu_item:
        // Not implemented here
        return false;
    default:
        break;
    }

    return false;
}

Фрагмент

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

@Override
public void onCreateOptionsMenu(Menu menu,MenuInflater inflater) {
    // Do something that differs the Activity menu here
    super.onCreateOptionsMenu(menu, inflater);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.activity_menu_item:
        // Not implemented here
        return false;
    case R.id.fragment_menu_item:
        // Do Fragment menu item stuff here
        return true;
    default:
        break;
    }

    return false;
}

Ответ 2

В ваших методах onCreate добавить setHasOptionsMenu(true);.

Если ваш фрагмент находится в ViewPager, то фрагмент с ViewPager также нуждается в указанной выше строке.

Ответ 3

Вы не можете напрямую обращаться к пунктам меню ActionBar в фрагменте. Вы можете сделать setHasOptionsMenu (true); в функции onCreateView в классе фрагментов, и это вызывает функцию onCreateOptionsMenu (меню меню) в соответствующем действии.

Там вы можете получить доступ ко всем пунктам меню, которые у вас есть на панели действий. Вы можете использовать:

MenuItem item = menu.getItem(index);

У вас есть один пример использования этого:

в фрагменте onCreateView class:

setHasOptionsMenu(true);

в соответствующем классе активности:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    MenuItem item = menu.getItem(0);
    if(condition)
        item.setVisible(true);
    else 
        item.setVisible(false);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (mDrawerToggle.onOptionsItemSelected(item)) {
        return true;
    }
    // Handle action bar actions click
    switch (item.getItemId()) {
       case R.id.action_logout:
           makeLogout();
           return  true;
       default :
           return super.onOptionsItemSelected(item);
    }

}

Ответ 4

Одна вещь, которую я бы добавил к этому (моя репутация не позволяет мне комментировать) и причина, по которой она не работает для меня.

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

public class MainActivity extends AppCompatActivity {

}

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

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

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

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

Ответ 5

Файл меню main.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"
    tools:context="dbl.contact.manager.MainActivity" >

    <item
        android:id="@+id/menu_search"
        android:actionLayout="@layout/action_bar"
        android:icon="@drawable/searchagain"
        android:orderInCategory="0"
        android:showAsAction="always"
        android:title="search"/>

</menu>

Это пункт меню. настраиваемая панель действий, такая как edittext в панели действий. Вам необходимо создать собственный макет. Здесь пользовательский файл action_bar.xml:

<?xml version="1.0" encoding="utf-8"?>

<EditText 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/inputSearch"
    android:layout_width="280dp"
    android:layout_height="40dp"
    android:cursorVisible="true"  
    android:hint="Search"
    android:imeOptions="actionDone"
    android:inputType="text"
    android:textColor="@android:color/white"
    android:textCursorDrawable="@android:color/white" />

Затем в классе фрагментов вы переопределите. Просто скопируйте и вставьте этот код.

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

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        // TODO Add your menu entries here
        super.onCreateOptionsMenu(menu, inflater);
         getActivity().getMenuInflater().inflate(R.menu.main, menu);
         View v = (View) menu.findItem(R.id.menu_search).getActionView();
         inputSearch = (EditText)v.findViewById(R.id.inputSearch);

            inputSearch.addTextChangedListener(new TextWatcher() {

                @Override
                public void afterTextChanged(Editable s) {
                    // TODO Auto-generated method stub
                    // clientAdapter.getFilter().filter(s.toString());
                }

                @Override
                public void beforeTextChanged(CharSequence s, int start, int count,
                        int after) {
                    // TODO Auto-generated method stub
                    // ListData.this.clientAdapter.getFilter().filter(s);
                }

                @Override
                public void onTextChanged(CharSequence s, int start, int before,
                        int count) {
                    // TODO Auto-generated method stub

                    adapter.getFilter().filter(s.toString());

                }

            });

    }