13

私は現在Androidプロジェクトに取り組んでおり、フラグメントとListViews/ListFragmentsを利用しています。ListActivityなどの標準的なアクティビティに対応するコンテキストアクションバーがあります。

今、私は同じようなことをしようとしていますが、フラグメントレイアウトを使用しています。2つのフラグメント、フラグメントAとフラグメントBを含むレイアウトのXMLを拡張するActivityを拡張するMainActivityがあります。

フラグメントAはListFragmentを拡張し、SQLiteデータベース内のデータから入力されるListViewを含みます。標準のListActivityで動作するコンテキストアクションバーがある場合、ListView.MultiChoiceModeListenerを拡張するクラスがありますが、これはListFragmentクラスまたは標準のアクティビティでは使用できないため、これを実装するにはどうすればよいですか。

私が達成したい基本的なことは、誰かがListFragmentを拡張するFragmentA内のListView内のアイテムを長押しすると、アクションバーが状況に応じて変化し、ユーザーがListView内から複数のアイテムを選択できるようにすることです。

あなたが提供できるどんな助けにも感謝します。

4

1 に答える 1

18

標準のListActivityで動作するコンテキストアクションバーがある場合、ListView.MultiChoiceModeListenerを拡張するクラスがありますが、これはListFragmentクラスまたは標準のアクティビティでは使用できないため、これを実装するにはどうすればよいですか。

どのように利用できないのかMultiChoiceModeListenerわかりません(おそらく、あなたが何をしようとしているのか理解できませんでした)。あなたのコメントから、互換性パッケージのフラグメントを使用すると仮定しました。以下は、2つの静的フラグメントを使用した例でありFragmentActivity、これらのフラグメントのそれぞれが、独自のメニューオプションを使用してコンテキストアクションバーをトリガーします。

これFragmentActivityは非常に単純で、以下の2つのフラグメントを保持しているだけです。

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

aが選択されたときにCABをトリガーするFragmentaから構成されるレイアウトを持つaの他のフラグメント:RadioGroupRadioButton

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プロジェクトにレイアウトとメニューファイルを含む完全なサンプルを見つけることができます)。

于 2012-09-26T09:14:37.430 に答える