2012-09-18 15 views
12

Actualmente estoy trabajando en proyectos de Android y haciendo uso de fragmentos y ListViews/ListFragments. Tengo barras de acción contextual que trabajan en actividades estándar como ListActivity.Uso de la barra de acción contextual con fragmentos

Ahora trato de hacer el mismo tipo de cosas pero en un diseño de fragmento. Tengo una actividad principal que amplía la actividad que infla el XML para el diseño que contiene los 2 fragmentos, fragmento A y fragmento B.

El fragmento A amplía ListFragment y contiene un ListView que se rellena desde datos dentro de una base de datos SQLite. Cuando tengo una barra de acción contextual trabajando en una ListActivity estándar, tengo una clase que Extiende ListView.MultiChoiceModeListener, pero esto no está disponible para una clase ListFragment o una actividad estándar, así que ¿cómo podría implementar esto?

Lo básico que quiero lograr es cuando alguien presiona largamente el elemento dentro de un ListView dentro de FragmentA que extiende ListFragment, la barra de acción cambia contextualmente y el usuario puede seleccionar varios elementos desde ListView.

Gracias por cualquier ayuda que pueda proporcionar.

+0

¿Qué versión de Android piensas apoyar? ¿Utiliza la biblioteca 'ActionBarSherlock'? – Luksprog

+0

Técnicamente es compatible con Android 2.3 y superior, sé que las barras de acción solo funcionan para honeycomb hacia arriba, lo cual está bien, ya que estoy desarrollando el código así que si usa 2.3 o menos maneja la aplicación de una manera y si usa honeycomb o superior puede usar la barra de acciones, entonces no, no estoy usando ActionBarSherlock – Boardy

Respuesta

17

Cuando tengo una barra de acción contextual trabajando en un estándar ListActivity tengo una clase que se extiende ListView.MultiChoiceModeListener pero esto no está disponible para una clase ListFragment o una actividad estándar así que ¿cómo iba a ir aproximadamente implementando esto.

No veo cómo MultiChoiceModeListener no está disponible (quizás no entendí lo que intenta hacer). De su comentario asumí que usa los fragmentos del paquete de compatibilidad. A continuación se muestra un ejemplo con FragmentActivity con dos fragmentos estáticos y cada uno de esos fragmentos activa la barra de acción contextual con sus propias opciones de menú.

El FragmentActivity es muy simple, sólo mantiene los dos fragmentos siguientes:

// 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!"); 
      } 
     }); 
    } 
} 

y el otro fragmento de una Fragment que tiene una disposición compuesta de un RadioGroup que desencadena la CAB cuando se selecciona 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; 
    } 
} 

ver si esto es lo que está buscando (se puede encontrar una muestra completa, incluyendo los diseños y archivos de menús in my github project).

+0

, pero si es el fragmento que implementa la barra de acciones normal, se mostrarán 2 barras de acciones a la vez :) – Warpzit

+0

@ Warpzit No estoy seguro de entender tu comentario, las dos acciones barras que aparecen a la vez (un escenario exacto sería útil para entender). – Luksprog

+0

Tuve otro problema> _ <, la barra de acciones contextual no se superpuso correctamente, consulte aquí: http://stackoverflow.com/q/26443403/969325 – Warpzit

Cuestiones relacionadas