2012-09-18 15 views
12

Attualmente sto lavorando su un progetto Android e utilizzo di frammenti e ListViews/ListFragments. Ho delle barre di azione contestuali che lavorano su attività standard come ListActivity.Utilizzo della barra delle azioni contestuale con frammenti

Ora sto provando a fare lo stesso genere di cose ma su un layout di frammento. Possiedo un MainActivity che estende Activity che gonfia l'XML per il layout che contiene i 2 frammenti, frammento A e frammento B.

Frammento A estende ListFragment e contiene un controllo ListView che viene popolato da dati all'interno di un database SQLite. Quando ho una barra di azione contestuale che funziona su ListActivity standard, ho una classe che Estende ListView.MultiChoiceModeListener ma questa non è disponibile per una classe ListFragment o un'attività standard, quindi come dovrei fare per implementarla.

La cosa di base che voglio ottenere è quando qualcuno preme a lungo l'oggetto all'interno di una ListView all'interno di FragmentA che estende ListFragment, la barra delle azioni cambia contestualmente e l'utente può quindi selezionare più elementi all'interno di ListView.

Grazie per l'aiuto che puoi fornire.

+0

Quale versione di Android pensate di supportare? Utilizzi la libreria 'ActionBarSherlock'? – Luksprog

+0

Tecnicamente supporta Android 2.3 e superiori, so barre di azione funzionano solo per l'alto a nido d'ape che va bene, come sto sviluppando il codice in modo se si utilizza 2,3 o sotto di esso gestisce l'applicazione in un modo e se si utilizza a nido d'ape o al di sopra, allora si può usare la barra delle azioni, in modo che nessun non sto usando ActionBarSherlock – Boardy

risposta

17

Quando ho avuto un bar un'azione contestuale lavorando su uno standard ListActivity ho una classe che estende ListView.MultiChoiceModeListener, ma questo non è disponibile per una classe ListFragment o un'attività standard così come dovrei fare circa implementando questo.

Non vedo come MultiChoiceModeListener non sia disponibile (forse non ho capito cosa si prova a fare). Dal tuo commento ho pensato che tu usassi i frammenti del pacchetto di compatibilità. Di seguito è riportato un esempio con FragmentActivity con due frammenti statici e ciascuno di questi frammenti attiva la barra di azione contestuale con le proprie opzioni di menu.

Il FragmentActivity è molto semplice, solo detiene i due frammenti di seguito:

// the list fragment 
public class ListCABFragment extends ListFragment { 

    private String[] mCountries = { "Romania", "Germany", "England", "USA", 
      "Japan", "France" }; 
    private static final boolean POST_HONEYCOMB = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB; 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     if (POST_HONEYCOMB) { 
      // make sure we are on a version above Honeycomb otherwise will 
      // access things that aren't available 
      postHoneycombCAB(); 
     } else { 
      // probably do nothing and implement the normal context menu?!? 
     } 
     setListAdapter(new ArrayAdapter<String>(getActivity(), 
       android.R.layout.simple_list_item_1, mCountries)); 
    } 

    @SuppressLint({ "NewApi", "NewApi" }) 
    private void postHoneycombCAB() { 
     getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); 
     getListView().setOnItemLongClickListener(new OnItemLongClickListener() { 

      @Override 
      public boolean onItemLongClick(AdapterView<?> parent, View view, 
        int position, long id) { 
       ((ListView) parent).setItemChecked(position, 
         ((ListView) parent).isItemChecked(position)); 
       return false; 
      } 
     }); 
     getListView().setMultiChoiceModeListener(new MultiChoiceModeListener() { 

      private int nr = 0; 

      @Override 
      public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
       getActivity().getMenuInflater().inflate(R.menu.listcab_menu, 
         menu); 
       return true; 
      } 

      @Override 
      public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 
       return false; 
      } 

      @Override 
      public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
       switch (item.getItemId()) { 
       case R.id.item1: 
        Toast.makeText(getActivity(), "Option1 clicked", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case R.id.item2: 
        Toast.makeText(getActivity(), "Option2 clicked", 
          Toast.LENGTH_SHORT).show(); 
        break; 

       } 
       return false; 
      } 

      @Override 
      public void onDestroyActionMode(ActionMode mode) { 
       nr = 0; 
      } 

      @Override 
      public void onItemCheckedStateChanged(ActionMode mode, 
        int position, long id, boolean checked) { 
       if (checked) { 
        nr++; 
       } else { 
        nr--; 
       } 
       mode.setTitle(nr + " rows selected!"); 
      } 
     }); 
    } 
} 

e l'altro frammento di Fragment che ha un layout composta da un RadioGroup che innesca la CAB quando viene selezionato un RadioButton:

public class SimpleCABFragment extends Fragment implements Callback { 

    private static final boolean POST_HONEYCOMB = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.frag_simplecabfragment, container, 
       false); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     RadioGroup rg = (RadioGroup) getView().findViewById(R.id.radioGroup1); 
     rg.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(RadioGroup group, int checkedId) { 
       if (POST_HONEYCOMB) { 
        // this could be improved so we don't need to create the 
        // option 
        // menu if it is already available 
        getActivity().startActionMode(SimpleCABFragment.this); 
       } else { 
        // something else 
       } 
      } 
     }); 
    } 

    @Override 
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
     if (item.getItemId() == R.id.itemradio) { 
      Toast.makeText(getActivity(), "CAB for Radiogroup!", 
        Toast.LENGTH_SHORT).show(); 
     } 
     return false; 
    } 

    @Override 
    public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
     getActivity().getMenuInflater().inflate(R.menu.simplecab_menu, menu); 
     return true; 
    } 

    @Override 
    public void onDestroyActionMode(ActionMode mode) { 
    } 

    @Override 
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 
     return false; 
    } 
} 

vedere se questo è quello che stai cercando (potete trovare un esempio completo, compreso il layout ei file menu in my github project).

+0

Ma se è il frammento che implementa l'ActionBar regolare avrai 2 actionbars mostrato in una volta :) – Warpzit

+0

@Warpzit io non sono sicuro di aver capito il tuo commento, le due azioni barre che appaiono contemporaneamente (uno scenario esatto sarebbe utile da capire). – Luksprog

+0

Ho avuto un altro problema> _ <, la barra di azione contestuale non si sovrapponeva correttamente, vedere qui: http://stackoverflow.com/q/26443403/969325 – Warpzit

Problemi correlati