android-listfragment - android使用带有 Fragments的上下文操作栏

  显示原文与译文双语对照的内容
85 3

我目前正在从事android项目,并使用 Fragments 和 listviews/ListFragments 。我在标准 activity 上使用上下文动作栏,例如 ListActivity 。

现在我尝试着做同样的事情,但在 fragment 布局上。我有一个 MainActivity,它扩展了 Activity,它扩展了包含 2 Fragments 。fragment A 和 fragment B的布局的XML 。

fragment A 扩展ListFragment并包含一个从SQLite数据库中的数据填充的ListView 。在标准ListActivity处理上下文操作栏时,我有一个扩展 ListView.MultiChoiceModeListener的类,但这对于ListFragment类或者标准 Activity 是不可以用的。

我想要实现的最基本的事情是在FragmentA内部按下一个项目来扩展 ListFragment 。

感谢你提供的任何帮助。

时间:原作者:0个回答

86 2

在标准ListActivity处理上下文操作栏时,我有一个扩展 ListView.MultiChoiceModeListener的类,但这对于ListFragment类或者标准 Activity 是不可以用的。

我不认为 MultiChoiceModeListener 是不可用的( 也许我不理解你在做什么) 。从你的评论中我假设你使用了兼容软件包中的Fragments 。下面是一个带有两个 Fragments的示例,其中每个 Fragments 触发上下文动作栏,其中包含自己的菜单选项。

FragmentActivity 非常简单,它只包含下面两个 Fragments:

//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的fragment,它的布局由一个由 RadioGroup 组成的布局组成,当选择了一个 RadioButton 时,该布局触发 CAB:

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项目中。) 。

原作者:
...