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);
}
Ответы
Ответ 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());
}
});
}