Панель действий Android на NavigationItemSelected
Я разрабатываю для Android 3+
В моей панели действий у меня есть выпадающий список (см., Как скрыть / показать список панели действий на Android 3? Для раскрывающегося списка, который я намереваюсь). Проблема заключается в том, что мне нужно выполнить определенное действие, когда пользователь что-то выбирает, но Android вызывает onNavigationItemSelected(), так как он рисует представление, поэтому выбор фактически не произошел.
Как я могу определить, действительно ли пользователь что-то нажал, и это не поддельный звонок от Android?
public class ListDittaListener implements OnNavigationListener{
private BaseActivity activity;
private ListDittaListener()
{
}
public ListDittaListener(BaseActivity activity)
{
this.activity = activity;
}
@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId)
{
MyApp appState = ((MyApp)this.activity.getApplicationContext());
appState.setDittaSelezionata( (int) itemId);
SharedPreferences settings = this.activity.getSharedPreferences(MyApp.PREFS_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putInt("ditta_id_selezionata", (int) itemId);
////////restart activity this.activity.recreate();
return false;
}
}
5 ответов
Вы можете легко проигнорировать первый звонок onNavigationItemSelected
если хочешь:
public class Whatever implements OnNavigationListener {
private boolean synthetic = true;
@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
if (synthetic) {
synthetic = false;
return true;
}
// do whatever you really wanted here
}
}
Метод onNavigationItemSelected(int itemPosition, long itemId)
в любом случае будет вызываться панелью действий.
То, что вы можете сделать, это сказать панели действий, что itemPosition
он должен перейти к методу при первом вызове. (Другими словами, сообщить панели действий, какой элемент навигации следует установить после создания действия). Вот код:
mActionBarMenuSpinnerAdapter = ...;
mActionBar = getActionBar();
mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
mActionBar.setListNavigationCallbacks(mActionBarMenuSpinnerAdapter, this);
mActionBar.setSelectedNavigationItem(###your_default_navigation_item_here###);
После этого вы можете решить свою проблему, применив изменения в onNavigationItemSelected(int itemPosition, long itemId)
если только itemPosition отличается.
Система Android вызовет NavigationItemSelected(0, 0) после настройки действия. (Что означает позже, чем onResume ()).
Как уже упоминали другие парни, лучше не делать хакерских действий, например игнорировать первый вызов, иначе система Android не будет вызывать onNavigationItemSelected() снова при выборе первого индекса. (Система считала, что первый элемент уже выбран)
Мое решение - вызвать actionbar.setSelectedNavigationItem(реальный элемент #, который вы хотите) после настройки панели действий. Затем система дважды вызовет метод NavigationItemSelected (). Сначала onNavigationItemSelected(0, 0), а затем onNavigationItemSelected (реальный элемент #).
У меня есть ViewPager с фрагментами, и мне нужно установить настраиваемую панель действий для каждого фрагмента в пейджере. На нужной странице у меня есть список навигации, фрагменты запускаются onNavigationItemSelected автоматически, когда я перелистываю страницы, хочу избежать этого поведения и запускать задачи, только если я выбрал элемент навигации вручную.
public class MyFragment extends Fragment implements ActionBar.OnNavigationListener {
private boolead fireReady = false;
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
// every time make it false, this method invoked on swipe action
fireReady = false;
if (isVisibleToUser) {
// setup actionbar, you also can setup action bar in activity
String[] array = getActivity().getResources().getStringArray(R.array.users_order);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_spinner_item, array);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
getActivity().getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
getActivity().getActionBar().setListNavigationCallbacks(adapter, this);
}
}
@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
if (fireReady) {
// task fire only when you directly press navigation item
UsersTask task = new UsersTask(getActivity());
task.setTaskListener(this);
task.execute(usersUrls[itemPosition]);
} else {
// make it true first time when page displayed
fireReady = true;
}
return false;
}
}
}
Ну, я не вижу ничего плохого в вашем текущем коде.
Как вы создали свои выпадающие элементы. И какой элемент "выбрать" в Android после создания представления. А что вы делаете в методе onCreate, где инициализируется ActionBar.
Я сделал это в соответствии с инструкциями, и это сработало для меня: http://developer.android.com/guide/topics/ui/actionbar.html