ツールバーにActionModeを表示


87

伝統的なものに加えて、android.view.ActionMode新しいものandroid.support.v7.widget.Toolbarで使用しようとしていますandroid.app.ActionBar。私はそれを表示することができます:

toolbar.startActionMode(callback);

問題は、がでActionModeActionBarなくの上に表示されることToolbarです。それを変える方法はありますか?

テーマに以下を設定しようとしましたが、何も変更されていないようです。

<item name="windowActionModeOverlay">true</item>

1
ActionModeはActionBarの一部であり、その位置を変更できないと思います
SpyZip

それは残念です。回答をありがとう
Ga –tan 2014年

1
ツールバーをアクションバーとして設定しましたか?
Nikola Despotoski 2014年

1
まだ同じ問題があります、これに関する更新はありますか?同じ状況、1つのツールバーをクラシックアクションバー、1つのツールバーを下に示すヘッダーとオプションメニューとして以下に示します。この問題に直面し、actionmodeを下に移動できません。
cV2 2015年

回答:


82

あなたが使用しているのでToolbar、私はまた、あなたが使用していると仮定 AppCompatActivityし、内蔵の交換したActionBarカスタムをToolbar使用して setSupportActionBar(toolbar);

まず、正しい名前空間をインポートしていることを確認します。

import androidx.appcompat.view.ActionMode;
// Or
import android.support.v7.view.ActionMode;

そしてない

import android.view.ActionMode;

次に使用します

_actionMode = startSupportActionMode(this);

そしてない

_actionMode = startActionMode(this);

35
これとwindowActionModeOverlay設定でうまくいきました。
Jimeux

4
現在使用してAppCompatActivityおり、追加するwindowActionModeOverlay だけで十分です。インポートを使用しようとしましたandroid.support.v7.view.ActionModeが、では機能しなかったMultiChoiceModeListenerため、android.view.ActionMode代わりに使用しました。のサポートバージョンがあるMultiChoiceModeListenerかどうかを知っていますか?ありがとう
アクセル

MultiChoiceModeListenerのサポートバージョンはありますか?
galaxigirl 2017

@galaxigirl、あるように見えません。あなたのアダプタと、ビューholderrでクリックイベントを処理する必要が
peterchaula

67

アクティビティではなく、ツールバーから開始してください。あなたの活動:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.startActionMode(mActionModeCallback)

そしてあなたは使用する必要があります

<item name="windowActionModeOverlay">true</item>

アンドレが述べたようにあなたのテーマで。


1
私も特別な要件を持っていたので、これは私にとってはうまくいきました。実装する代わりに、実装しActionMode.CallbackたかったMultiChoiceModeListener。サポートの使用に関する問題ActionModeは、のサポートバージョンがないように見えることMultiChoiceModeListenerです。
jwir3

43

あなたのテーマでこれを試してください:

<item name="windowActionModeOverlay">true</item>

私の質問で述べたように、私はすでにこれを試みましたが成功しませんでした。でもありがとう!
ガエタン

申し訳ありませんが、あなたがすでにそれを試したことに気づきませんでした。動作しませんか?わたしにはできる。
アンドレ・Restivo

私は同じ問題を抱えていましたが、これで修正されました。ありがとう!
マルタロドリゲス

2
android:プレフィックスを付けて、または付けずに試して、アプリケーションのテーマに入れました。はをActionModeオーバーレイしますが、の下にあるのActionBar上に重ねToolbarますActionBar
ガエタン

@Gaëtanこれに対する答えはありましたか?私のアプリはAPI 21以上をサポートしているため、同じ問題が発生し、AppCompatActivityではなくActivityを拡張しています。
SjDev

14

人々が明確にしていないことの1つは、

<item name="windowActionModeOverlay">true</item>

AppTheme.NoActionBarではなく、基本テーマ、つまりAppThemeに配置されます

<resources>

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="windowActionModeOverlay">true</item>
</style>

<style name="transparent" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowIsTranslucent">true</item>
</style>


<style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />

<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />


これが私が必要とした唯一の変更でした。ありがとう!
PNDA

5

AndroidManifest.xmlを見つけて、次にアプリケーションまたはアクティビティテーマに以下のコードを追加します

<item name="windowActionModeOverlay">true</item>

以下のようなので:

<style name="WorkTimeListTheme" parent="AppTheme.NoActionBar">
        <item name="windowActionModeOverlay">true</item>
        <item name="actionModeBackground">@color/theme_primary</item>
    </style>

1

これが私が作った解決策です。

私にはonCreateActionModeの方法ActionMode.Callback、私はこれを追加します。

StandaloneActionMode standaloneActionMode = (StandaloneActionMode) actionMode;
Field mContextView;
try {
     mContextView = StandaloneActionMode.class.getDeclaredField("mContextView");
     mContextView.setAccessible(true);
     View contextView = (View) mContextView.get(standaloneActionMode);
     MarginLayoutParams params = (MarginLayoutParams) contextView.getLayoutParams();
     params.topMargin = mToolbar.getTop();
  } catch (NoSuchFieldException e) {
            e.printStackTrace();
  } catch (IllegalAccessException e) {
            e.printStackTrace();
  } catch (IllegalArgumentException e) {
            e.printStackTrace();
  }

わたしにはできる。


1

上記の方法をすべて試しましたが、それでも機能しません。そして、私は以下の方法を試しました:

    private class ActionModeCallback implements ActionMode.Callback {
    @Override
    public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
        actionMode.getMenuInflater().inflate(R.menu.note_find_action, menu);
        return true;
    }

    @Override
    public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
        ((AppCompatActivity) getActivity()).getSupportActionBar().hide();
        return false;
    }

    @Override
    public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
        return false;
    }

    @Override
    public void onDestroyActionMode(ActionMode actionMode) {
        ((AppCompatActivity) getActivity()).getSupportActionBar().show();
    }
}

ここでは、サポートライブラリのアクションモードとstartSupportActionModeメソッドを使用しました。同時に、私は与えられた活動のテーマを変更することも試みました。確かに、それは機能しません。したがって、本当に良い選択がない場合は、これを試すことができます。

最近、カラフルフレームを使用してアプリの複数のテーマを有効にしていることがわかりました。これにより、コードのテーマが変更されます。このフレームワークでスタイルを変更しようとしたところ、うまくいきました。

それがうまくいくことを願っています。


これは私のために働いた唯一のものです。どうもありがとう。
Rachit

0

ビューツリーが表示された場合は、以下のコードを記述できます。

 ViewGroup decorView = (ViewGroup) getWindow().getDecorView();
    traverseView(decorView);
 /**
 * traverse find actionmodebar
 * @param root  view
 */
public void traverseView(View root) {
    if (root==null){
        return;
    }
    if (root instanceof ActionBarContextView){
        root.setVisibility(View.GONE);
        return;
    }
    if ((root instanceof ViewGroup)) { // If view is ViewGroup, apply this method on it's child views
        ViewGroup viewGroup = (ViewGroup) root;
        for (int i = 0; i < viewGroup.getChildCount(); ++i) {
            traverseView(viewGroup.getChildAt(i));
        }
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.