2012-03-01 3 views
11

Я разрабатываю для андроида 3+андроид бар действия onNavigationItemSelected

В моем действии бара у меня есть выпадающий список (см how to hide/unhide the actionbar list on 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; 
    } 

} 

ответ

16

Вы можете легко просто игнорировать первый вызов 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 
    } 
} 
+1

спасибо, но, как я написал в описании bounty, «я бы хотел избегайте использования счетчика и игнорирования первого вызова », это похоже на хак, я хотел бы понять, почему это происходит в первую очередь. – max4ever

+3

У меня такая же проблема, и это ужасно раздражает, чтобы взломать ее таким образом. Есть ли цель такого поведения? –

+0

Я использовал это решение для предотвращения ненужного повторного создания фрагментов, когда ориентация экрана меняется и теряется. См. [Здесь] (http://stackoverflow.com/a/14295474/963396). –

0

Ну, я не вижу ничего плохого в вашем текущем коде.

Как вы создали свои выпадающие элементы. И какой элемент «выбирает» Android после создания представления. И что вы делаете в методе onCreate, где инициализируется ActionBar.

Я сделал это, как указано здесь, и это работает для меня: http://developer.android.com/guide/topics/ui/actionbar.html#Dropdown

+0

он «выбирает» первый элемент выпадающего элемента onCreate, я обычно просто вызываю код из другого связанного вопроса (в основном, просто action_bar.setNavigationMode и action_bar.setListNavigationCallbacks) – max4ever

+0

Mhh на точке зрения вы все делаете правильно. Вы поворачиваете экран? Я нашел аналогичную проблему здесь: http: // stackoverflow.com/questions/9039045/how-to-set-active-item-in-the-action-bar-drop-down-navigation – Moritz

+0

nope not rotating screen – max4ever

2

андроид система будет вызывать onNavigationItemSelected (0, 0) после настройки активности. (Это означает, что позже, чем onResume()).

Как отмечали другие ребята, вам лучше не делать взлома, как игнорировать первый вызов, иначе система Android не будет вызывать onNavigationItemSelected() снова, когда вы выбираете первый индекс. (Система считала, что первый элемент уже выбран)

Мое решение - вызов actionbar.setSelectedNavigationItem (реальный элемент #, который вы хотите) после настройки панели действий. Затем система будет вызывать onNavigationItemSelected() дважды. Сначала onNavigationItemSelected (0, 0), а затем onNavigationItemSelected (реальный элемент #).

+0

Сначала вы сказали, что лучше не игнорировать первый вызов, но что вы будете делать, когда вызывается 'onNavigationItemSelected (0, 0)'? – skywall

0

У меня есть просмотрщик с фрагментами, и мне нужно установить настраиваемую панель действий для каждого фрагмента в пейджере На желаемой странице у меня есть список навигации, огонь фрагментов 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; 
    } 

} 

} 
4

Метод 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 отличается.

Смежные вопросы