9

本当に奇妙です。Eclipse で初めてアプリケーションを起動し、startActionMode を呼び出すと、すべて正常に動作します。アプリを閉じて再度開くと、startActionMode は null を返します。アプリで何かを変更してEclipseから再度実行するまで、常にnullが返されます。ドキュメントでは、キャンセルされた場合、startActionMode は null を返すと書かれていますが、キャンセルされた理由については説明されていません。

何か案は?ところで、私はactionbarsherlockを使用しています

更新:電話をシャットダウンするか、アプリを強制終了してアプリを再度起動すると、機能します...しかし、閉じて再度開くと同じことが起こります。

ここに私のコードがあります: ActionModeCallback クラス:

   class ActionModeCallback implements ActionMode.Callback{

    @Override 
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
          MenuInflater inflater = mode.getMenuInflater();
          inflater.inflate(R.menu.contextactiondownloads, menu);
          return true;
        }

    @Override
    public void onDestroyActionMode(ActionMode mode) {

    }

    @Override
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {

    }

    @Override
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        // TODO Auto-generated method stub

        return false;
    }
};

私の主な活動では:

public ActionMode startActionMode()
{
    mActionMode = startActionMode(new ActionModeCallback());
    return mActionMode;
}

私のリストビューアダプターでは:

 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                MainActivity activity = (MainActivity)rowView.getContext();
                if (isChecked) {

                    if(actionmode == null){
                        actionmode = activity.startActionMode();
                    }else
                    {
                        actionmode.invalidate();
                    }
                }
                else {
                        activity.finishActionMode();
                        actionmode=null;
                }
            }
        });
4

4 に答える 4

1

ええと、なぜそれがあなたに起こっているのか、私にはよくわかりません。しかし、古い Gmail の ListView と同じ動作をする ListView を作成しました。

基本的に、ユーザーは項目の 1 つを長押しして「選択モード」を開始できます。その後、ユーザーは長押しするか、項目の左側をクリックして、他の項目を選択できます。チェックボックスは、「選択モード」で表示し、「選択モード」ではないときに非表示にすることで、アダプターによって管理されます。また、現在のアイテムが選択されているかどうかを確認することで、それをチェックします。次に、ListView がタッチ イベントを取得できるように、クリック不可にします。

ListView を「選択モード」で開始する場合は、selectableFromTheBeginning を true に設定できます。そして、CheckBox を最初から表示できるようにします。後で使いやすくして文書化しますが、今は使えると思います。

SelectionListView のリンクは次のとおりです。

https://github.com/Cyber​​Eagle/OpenProjects/blob/master/android-projects/widgets/src/main/java/br/com/cybereagle/androidwidgets/view/SelectionListView.java

また、XML 経由で設定される SelectionListView 属性を指定する attrs.xml の一部をコピーする必要があります。

https://github.com/Cyber​​Eagle/OpenProjects/blob/master/android-projects/widgets/res/values/attrs.xml

これを使用するには、ActionMode.ActionModeCallback の代わりに SelectionListView.SelectionActionModeCallback を実装します。親のメソッドを呼び出すことを忘れないでください。

XML で使用し、ID で検索できます。したがって、ユーザーがアイテムを選択したときに表示されるメッセージを次のように変更できます。

listView.setSelectedStringFormat("%d selected items");

メソッド setActionModeCallback を使用して、SelectionListView.SelectionActionModeCallback の実装を設定します。

アダプターでは、次のようなことができます。

checkBox.setChecked(listView.isItemChecked(position));

ActionModeCallback では、次のようなものを実装できます。

public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
    SparseBooleanArray checkedItems = listView.getCheckedItemPositions();

    List<Item> selectedItems = new ArrayList<Item>();

    for (int i = 0; i < checkedItems.size(); i++) {
        if (checkedItems.valueAt(i)) {
            selectedItems.add(yourListOfItems.get(checkedItems.keyAt(i)));
        }
    }

    switch(item.getId()){
        case R.id.do_something:
            doSomething(selectedItems);
            mode.finish();
            break;
    }
}

チェックボックスは次のようになります。

<CheckBox
    android:id="@+id/select"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:clickable="false"
    android:focusable="false"
    android:focusableInTouchMode="false" />

このウィジェットを使用すると、ActionMode や項目の選択方法についてあまり心配する必要はありません。書類不備ですみません。これは、他のプロジェクトで使用するコードを入れたリポジトリです。文書化する予定です。あなたが見ることができる他のウィジェットがあります。

これを使用する場合は、Apache ライセンスを尊重してください。

于 2013-07-19T23:08:25.187 に答える
0

キャンセルされた場合、startActionMode は null を返します

ばかげた考えですが、アプリを閉じたときに何が起こるかを処理するアプリの部分で設定する必要があるものに startActionMode を設定するとうまくいきますか?

于 2013-07-21T13:58:37.963 に答える