2012-03-01 18 views
11

estoy desarrollando para android 3+barra de acción androide onNavigationItemSelected

En mi barra de acción tengo una lista desplegable (ver how to hide/unhide the actionbar list on android 3? para el desplegable tengo la intención). El problema es que necesito hacer una determinada acción cuando el usuario selecciona algo, pero Android llama aNavigationItemSelected() como soons, ya que dibuja la vista, por lo que no se realizó ninguna selección.

¿Cómo puedo detectar si el usuario realmente presionó algo y no es una llamada falsa de 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; 
    } 

} 

Respuesta

16

Usted puede simplemente ignorar la primera llamada a onNavigationItemSelected si te gusta:

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

gracias pero como escribí en la descripción de la abundancia, "me gustaría evitar usar un contador e ignorar la primera llamada ", esto parece más como un truco, me gustaría entender por qué ocurre esto en primer lugar – max4ever

+3

Tengo el mismo problema y es terriblemente molesto hackearlo de esta manera. ¿Hay un propósito para tal comportamiento? –

+0

Utilicé esta solución para evitar que los Fragmentos se reprodujeran innecesariamente dos veces cuando la orientación de la pantalla cambia y pierde su estado. Ver [aquí] (http://stackoverflow.com/a/14295474/963396). –

0

Bien No puedo ver nada malo en su código actual.

Cómo se crearon los elementos desplegables. Y qué elemento es "seleccionado" por Android después de que se crea la vista. ¿Y qué estás haciendo en tu método onCreate donde se inicializa ActionBar?

lo hice como se indica aquí y funcionó para mí: http://developer.android.com/guide/topics/ui/actionbar.html#Dropdown

+0

se "selecciona" el primer elemento del elemento desplegable, onCreate por lo general sólo llamo el código de la otra cuestión vinculada (básicamente sólo action_bar.setNavigationMode y action_bar.setListNavigationCallbacks) – max4ever

+0

MHH del punto de vista que está haciendo todo lo correcto. ¿Estás rotando tu pantalla? Encontré un problema similar aquí: http: // stackoverflow.com/questions/9039045/how-to-set-active-item-in-the-action-bar-drop-down-navigation – Moritz

+0

no no rotando la pantalla – max4ever

2

El sistema androide llamará onNavigationItemSelected (0, 0) después de configurar la actividad. (Lo que significa más adelante que onResume()).

Como otros chicos mencionaron, es mejor que no hagas ningún truco como ignorar la primera llamada, de lo contrario el sistema android no volverá a llamar aNavigationItemSelected() cuando selecciones el primer índice. (El sistema pensó que el primer elemento ya está seleccionado)

Mi solución es llamar a actionbar.setSelectedNavigationItem (el elemento real # que desea) después de configurar la barra de acciones. Entonces el sistema llamará aNavigationItemSelected() dos veces. Primero onNavigationItemSelected (0, 0) y luego onNavigationItemSelected (el artículo real #).

+0

Al principio, ha dicho que es mejor no ignorar la primera llamada, pero ¿qué hace cuando se llama a 'onNavigationItemSelected (0, 0)'? – skywall

0

Tengo viewpager con fragmentos y necesito establecer una barra de acción personalizada para cada fragmento en el localizador En la página deseada tengo una lista de navegación, fragmentos de incendios en NavigationItemSelected automáticamente cuando deslizo páginas, quiero evitar este comportamiento y ejecutar tareas solo si Elemento de navegación seleccionado manualmente.

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

Método onNavigationItemSelected(int itemPosition, long itemId) será llamada de todos modos por la barra de acción.

Lo que puede querer hacer es decirle a la barra de acciones qué itemPosition debe pasar al método en la primera llamada. (En otras palabras, para indicarle a la barra de acciones qué elemento de navegación debe establecerse después de crear la actividad). Aquí está el código:

mActionBarMenuSpinnerAdapter = ...; 
mActionBar = getActionBar(); 
mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); 
mActionBar.setListNavigationCallbacks(mActionBarMenuSpinnerAdapter, this); 
mActionBar.setSelectedNavigationItem(###your_default_navigation_item_here###); 

Después de hacer esto se puede resolver su problema mediante la aplicación de los cambios en el onNavigationItemSelected(int itemPosition, long itemId) aunque sólo itemPosition es diferente.

Cuestiones relacionadas