2013-07-12 20 views
9

È davvero strano. La prima volta che avvio l'applicazione in eclipse e chiamo startActionMode, tutto funziona correttamente. Se chiudo l'app e la riapre, startActionMode restituisce null. Resterà sempre nullo fino a quando non avrò cambiato qualcosa nell'app ed eseguirlo di nuovo da Eclipse. Nella documentazione, dice che startActionMode restituisce null se è stato cancellato, ma non spiega perché è stato cancellato.startActionMode restituisce null

Qualche idea? btw, `m utilizzando ActionBarSherlock

UPDATE: se mi arresto il mio telefono o uccidere l'applicazione e iniziare di nuovo l'applicazione, funziona ... ma poi fa la stessa cosa quando io lo chiudo e apro di nuovo.

ecco il mio codice: classe ActionModeCallback:

class ActionModeCallback implements ActionMode.Callback{ 

    @Override 
    public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
      MenuInflater inflater = mode.getMenuInflater(); 
      inflater.inflate(R.menu.contextactiondownloads, menu); 
      return true; 
     } 

    @Override 
    public void onDestroyActionMode(ActionMode mode) { 

    } 

    @Override 
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 

    } 

    @Override 
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 
     // TODO Auto-generated method stub 

     return false; 
    } 
}; 

Nel mio mainactivity:

public ActionMode startActionMode() 
{ 
    mActionMode = startActionMode(new ActionModeCallback()); 
    return mActionMode; 
} 

Nel mio adattatore ListView:

public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 

       MainActivity activity = (MainActivity)rowView.getContext(); 
       if (isChecked) { 

        if(actionmode == null){ 
         actionmode = activity.startActionMode(); 
        }else 
        { 
         actionmode.invalidate(); 
        } 
       } 
       else { 
         activity.finishActionMode(); 
         actionmode=null; 
       } 
      } 
     }); 
+0

Dove esattamente nella tua attività stai chiamando startActionMode()? – Christos

+0

L'ho chiamato dal mio adattatore listview, guarda il codice sopra: actionmode = activity.startActionMode(); –

+0

È l'ActionBar nativo o compatibile (si tratta di dispositivo ICS o superiore?). Se è quella nativa, questa riga dei documenti ufficiali potrebbe applicarsi a te - 'restituisce il ContextMode che era stato avviato, o null se è stato cancellato' – Delyan

risposta

1

Così ho finalmente trovato una soluzione che probabilmente NON è la soluzione migliore, ma non ho trovato altre soluzioni. Ho fatto un processo di uccisione in onDestroy sulla mia attività.

come questo:

android.os.Process.killProcess(android.os.Process.myPid()); 

Si sta lavorando ora. Sembra che il mio telefono non cancellasse il ricordo di qualcosa.

EDIT: Non riesco a utilizzare questa soluzione perché ho un servizio che deve essere aperto anche se l'app è chiusa. Anche il killProcess uccide il servizio.

EDIT 2 Ho finalmente trovato la fonte del mio problema. Stavo mantenendo una variabile statica di uno dei miei frammenti. Per qualche motivo, tale variabile è stata mantenuta in memoria anche al riavvio dell'app. Non so ancora esattamente perché startActionMode restituisce null. Per risolverlo, ho istanziato la mia variabile nel onCreate della mia attività.

1

Beh, non ho davvero capito perché sta accadendo con te. Ma ho creato un ListView che ha lo stesso comportamento del vecchio ListView di Gmail.

Fondamentalmente, l'utente può avviare la "Modalità di selezione" premendo a lungo uno degli elementi e quindi, l'utente può selezionare altre voci facendo un clic lungo o facendo clic sulla parte sinistra dell'elemento. La casella di controllo è gestita dall'adattatore rendendolo visibile in "Modalità di selezione" e invisibile quando non è in "Modalità di selezione". Lo fai anche verificando controllando se l'elemento corrente è selezionato. Quindi, rendilo non cliccabile, in modo che ListView possa ottenere gli eventi touch.

Se si desidera avviare ListView in "Modalità di selezione", è possibile impostare su true l'opzione Da scegliere. E poi, rendi visibile il CheckBox dall'inizio. Lo renderò più facile da usare e documenterò in seguito, ma penso che sia utilizzabile ora.

Ecco il link per il SelectionListView:

https://github.com/CyberEagle/OpenProjects/blob/master/android-projects/widgets/src/main/java/br/com/cybereagle/androidwidgets/view/SelectionListView.java

Avrete anche bisogno di copiare la parte del mio attrs.xml che specifica gli attributi SelectionListView da impostare tramite XML.

https://github.com/CyberEagle/OpenProjects/blob/master/android-projects/widgets/res/values/attrs.xml

Per usarlo, si implementa SelectionListView.SelecionActionModeCallback invece di ActionMode.ActionModeCallback. Ricorda di chiamare i metodi del genitore.

È possibile utilizzarlo nell'XML e trovarlo per ID. Così si può cambiare il messaggio che viene visualizzato quando l'utente selezionare le voci utilizzando:

listView.setSelectedStringFormat("%d selected items"); 

si imposta l'implementazione del SelectionListView.SelecionActionModeCallback utilizzando il metodo setActionModeCallback.

l'adattatore, si può fare qualcosa di simile:

checkBox.setChecked(listView.isItemChecked(position)); 

Nella tua ActionModeCallback, è possibile implementare qualcosa di simile:

public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
    SparseBooleanArray checkedItems = listView.getCheckedItemPositions(); 

    List<Item> selectedItems = new ArrayList<Item>(); 

    for (int i = 0; i < checkedItems.size(); i++) { 
     if (checkedItems.valueAt(i)) { 
      selectedItems.add(yourListOfItems.get(checkedItems.keyAt(i))); 
     } 
    } 

    switch(item.getId()){ 
     case R.id.do_something: 
      doSomething(selectedItems); 
      mode.finish(); 
      break; 
    } 
} 

tua casella sarebbe simile a questa:

<CheckBox 
    android:id="@+id/select" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:clickable="false" 
    android:focusable="false" 
    android:focusableInTouchMode="false" /> 

Con questo widget, non è necessario preoccuparsi troppo con l'ActionMode o con il modo selezionerai gli oggetti. Mi dispiace per la mancanza di documentazione. Questo è il repository Ho messo del codice da usare in altri progetti. Sto pensando di documentarlo. Ci sono altri widget che puoi guardare.

Se si utilizza questo, per favore, basta rispettare la licenza Apache.

+0

sembra grandioso, ci provo io –

+0

Ok. Se hai dei dubbi, chiedimi. Un'altra cosa: puoi tenere traccia se la modalità ActionMode viene visualizzata o meno con i callback ActionMode. Se trovi qualche bug o pensi che dovrebbe avere un'altra funzionalità, crea un problema qui: http://jira.cybereagle.net/browse/OP. –

+0

Avete qualche esempio funzionante? –

0

startActionMode restituisce null se è stato annullato

un'idea stupida ... ma dovrebbe funzionare se si imposta startActionMode a qualunque cosa dovrebbe essere fissato a nella parte della vostra applicazione che gestisce ciò che accade quando chiudi l'app?

0
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
    MainActivity activity = (MainActivity)rowView.getContext(); 
} 

Qui rowView avrebbe dovuto essere buttonView. Forse sta causando l'errore.