0

私は画像を表示するためのアプリを作成しています。そのため、グリッド ビューで画像の複数選択削除を実装することにしました。メソッド。私は常にそのような例外を受け取ります:

 java.lang.StackOverflowError
        at android.support.v7.internal.view.SupportActionModeWrapper$CallbackWrapper.onDestroyActionMode(SupportActionModeWrapper.java:174)
        at android.support.v7.app.AppCompatDelegateImplV7$ActionModeCallbackWrapperV7.onDestroyActionMode(AppCompatDelegateImplV7.java:1656)
        at android.support.v7.internal.app.WindowDecorActionBar$ActionModeImpl.finish(WindowDecorActionBar.java:972)
        at android.support.v7.internal.view.SupportActionModeWrapper.finish(SupportActionModeWrapper.java:78)
        at com.example.vasylpaliy.mediaview.ImageList$1.onDestroyActionMode(ImageList.java:91)
        at android.widget.AbsListView$MultiChoiceModeWrapper.onDestroyActionMode(AbsListView.java:6604)
        at com.android.internal.policy.impl.PhoneWindow$DecorView$ActionModeCallbackWrapper.onDestroyActionMode(PhoneWindow.java:3048)
        at android.support.v7.internal.view.SupportActionModeWrapper$CallbackWrapper.onDestroyActionMode(SupportActionModeWrapper.java:174)
        at android.support.v7.app.AppCompatDelegateImplV7$ActionModeCallbackWrapperV7.onDestroyActionMode(AppCompatDelegateImplV7.java:1656)
        at android.support.v7.internal.app.WindowDecorActionBar$ActionModeImpl.finish(WindowDecorActionBar.java:972)
        at android.support.v7.internal.view.SupportActionModeWrapper.finish(SupportActionModeWrapper.java:78)
        at com.example.vasylpaliy.mediaview.ImageList$1.onDestroyActionMode(ImageList.java:91)
        at android.widget.AbsListView$MultiChoiceModeWrapper.onDestroyActionMode(AbsListView.java:6604)
        at com.android.internal.policy.impl.PhoneWindow$DecorView$ActionModeCallbackWrapper.onDestroyActionMode(PhoneWindow.java:3048)
        at android.support.v7.internal.view.SupportActionModeWrapper$CallbackWrapper.onDestroyActionMode(SupportActionModeWrapper.java:174)
        at android.support.v7.app.AppCompatDelegateImplV7$ActionModeCallbackWrapperV7.onDestroyActionMode(AppCompatDelegateImplV7.java:1656)
        at android.support.v7.internal.app.WindowDecorActionBar$ActionModeImpl.finish(WindowDecorActionBar.java:972)
        at android.support.v7.internal.view.SupportActionModeWrapper.finish(SupportActionModeWrapper.java:78)
        at com.example.vasylpaliy.mediaview.ImageList$1.onDestroyActionMode(ImageList.java:91)
        at android.widget.AbsListView$MultiChoiceModeWrapper.onDestroyActionMode(AbsListView.java:6604)
        at com.android.internal.policy.impl.PhoneWindow$DecorView$ActionModeCallbackWrapper.onDestroyActionMode(PhoneWindow.java:3048)
        at android.support.v7.internal.view.SupportActionModeWrapper$CallbackWrapper.onDestroyActionMode(SupportActionModeWrapper.java:174)
        at android.support.v7.app.AppCompatDelegateImplV7$ActionModeCallbackWrapperV7.onDestroyActionMode(AppCompatDelegateImplV7.java:1656)
        at android.support.v7.internal.app.WindowDecorActionBar$ActionModeImpl.finish(WindowDecorActionBar.java:972)
        at android.support.v7.internal.view.SupportActionModeWrapper.finish(SupportActionModeWrapper.java:78)
        at com.example.vasylpaliy.mediaview.ImageList$1.onDestroyActionMode(ImageList.java:91)
        at android.widget.AbsListView$MultiChoiceModeWrapper.onDestroyActionMode(AbsListView.java:6604)
        at com.android.internal.policy.impl.PhoneWindow$DecorView$ActionModeCallbackWrapper.onDestroyActionMode(PhoneWindow.java:3048)
        at android.support.v7.internal.view.SupportActionModeWrapper$CallbackWrapper.onDestroyActionMode(SupportActionModeWrapper.java:174)
        at android.support.v7.app.AppCompatDelegateImplV7$ActionModeCallbackWrapperV7.onDestroyActionMode(AppCompatDelegateImplV7.java:1656)
        at android.support.v7.internal.app.WindowDecorActionBar$ActionModeImpl.finish(WindowDecorActionBar.java:972)
        at android.support.v7.internal.view.SupportActionModeWrapper.finish(SupportActionModeWrapper.java:78)
        at com.example.vasylpaliy.mediaview.ImageList$1.onDestroyActionMode(ImageList.java:91)
        at android.widget.AbsListView$MultiChoiceModeWrapper.onDestroyActionMode(AbsListView.java:6604)
        at com.android.internal.policy.impl.PhoneWindow$DecorView$ActionModeCallbackWrapper.onDestroyActionMode(PhoneWindow.java:3048)

コードは次のとおりです。

view.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
        private boolean isDeleted;
        private ArrayList<String> imageItems;
        {
            imageItems=new ArrayList<String>();
            isDeleted=false;
        }
        @Override
        public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
            imageItems.add(imagePaths.get(position));
            mode.setTitle("Selected:" + Integer.toString(view.getCheckedItemCount()));
            imageAdapter.setCheckMark(position);
            imageAdapter.notifyDataSetChanged();
        }
        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            mode.getMenuInflater().inflate(R.menu.multiple_audio, 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.multiple_audio_select_all:
                {
                    imageItems=imagePaths;
                    for(int i=0;i<imageItems.size();i++)
                        view.setItemChecked(i,true);
                    break;
                }
                case R.id.multiple_audio_deleting:
                {
                    deleteItems(imageItems);
                    isDeleted=true;
                    onDestroyActionMode(mode);
                    break;
                }
            }
            return true;
        }
        @Override
        public void onDestroyActionMode(ActionMode mode) {
            if(mode!=null)
                mode.finish();
        }
    });
4

2 に答える 2

0

finish()それを呼び出すとonDestroyActionMode()、モードがnullに設定されません。

したがって、必要なのは次のとおりです。

@Override
public void onDestroyActionMode(ActionMode mode) {
     // nothing here ;)
}

ここでアクションモードを終了したい場合は、次の点にも注意してください。

 case R.id.multiple_audio_deleting:
     {
     deleteItems(imageItems);
     isDeleted=true;
     onDestroyActionMode(mode);
     break;
 }

次のように変更します。

case R.id.multiple_audio_deleting:
     {
     deleteItems(imageItems);
     isDeleted=true;
     mode.finish();
     break;
 }
于 2015-11-27T13:29:39.267 に答える
0

StackoverflowError は、「onActionItemClicked()」と「onDestroyActionMode()」の実装が原因だと思います。

「onDestroyActionMode()」を実行するたびmode.finish();に、フレームワークはこのメソッドを正確にもう一度呼び出すため、一種の無限ループが作成されます。

公式ドキュメントのサンプル、特にListView または GridView でのバッチ コンテキスト アクションの有効化に関する部分によると、次の2 つの点を変更する必要があります。

1.「onActionItemClicked()」の実装で、呼び出します

mode.finish();

「onDestroyActionMode()」の代わりに。

2.「onDestroyActionMode()」では、「finish()」を呼び出す必要はありません。このメソッドをオーバーライドして、

...CAB が削除されたときにアクティビティに必要な更新を行います。デフォルトでは、選択された項目は選択解除/チェック解除されています。

于 2015-11-27T13:30:14.217 に答える