Использование контекстной панели действий с фрагментами

В настоящее время я работаю над проектом android, используя фрагменты и ListViews / ListFragments. У меня есть контекстные панели действий, работающие над стандартными действиями, такими как ListActivity.

Теперь я пытаюсь сделать то же самое, но на макете фрагмента. У меня есть MainActivity, который расширяет Activity, который раздувает XML для макета, который содержит 2 фрагмента, фрагмент A и фрагмент B.

Фрагмент A расширяет ListFragment и содержит ListView, который заполняется данными из базы данных SQLite. Когда у меня есть панель контекстных действий, работающая над стандартным ListActivity, у меня есть класс, который расширяет ListView.MultiChoiceModeListener, но это не доступно для класса ListFragment или стандартного действия, так как я могу это сделать.

Основная цель, которую я хочу достичь, – это когда кто-то долго нажимает на элемент в ListView внутри FragmentA, который расширяет ListFragment, панель действий контекстно изменяется, и пользователь может затем выбрать несколько элементов из ListView.

Спасибо за любую помощь, которую вы можете предоставить.

Solutions Collecting From Web of "Использование контекстной панели действий с фрагментами"

Когда у меня есть панель контекстных действий, работающая над стандартным ListActivity, у меня есть класс, который расширяет ListView.MultiChoiceModeListener, но это не доступно для класса ListFragment или стандартного действия, так как я могу это сделать.

Я не вижу, как MultiChoiceModeListener недоступен (возможно, я не понял, что вы пытаетесь сделать). Из вашего комментария я предположил, что вы используете фрагменты из пакета совместимости. Ниже приведен пример с FragmentActivity с двумя статическими фрагментами, и каждый из этих фрагментов запускает контекстную панель действий со своими параметрами меню.

FragmentActivity очень прост, он просто содержит два фрагмента ниже:

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

И другой фрагмент для Fragment который имеет макет, составленный из RadioGroup который запускает CAB при RadioGroup 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; } } 

Посмотрите, если это то, что вы ищете (вы можете найти полный образец, включая макеты и файлы меню в моем проекте github ).