AppCompat-v7でのツールバーとコンテキストアクションバー


182

LollipopとAppCompat-v7ライブラリで導入された、新しく追加されたツールバーの使用に取り組んでいます。ツールバーの設定についてこのガイドに従いましたが、コンテキストアクションバー(コピー/貼り付けのためにテキストを強調表示するなど)を表示するものを呼び出すと、ページ上でツールバーが押し下げられることに気付きました。ページの下部にある画像で、私が話していることを確認できます。

なので、基本的にはこう設定しました。インクルードタグで使用するxmlファイルでツールバーを定義しています。

<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimary"/>

次に、それを自分のビューでインスタンス化します。

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:id="@+id/root"
    tools:context=".MainActivity">

    <include
        layout="@layout/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/> 

    <!-- Rest of view -->

    </LinearLayout>

コードでは、次のように設定します。

    // On Create method of activity:
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

Contextual ActionBarがツールバーの上に来るようにする方法を誰かが知っていますか?

ツールバーとコンテキストアクションバー


活動のテーマは何ですか?
alanv 2014年

デビッド、私はリンクをクリックしただけで、それは私のために働いているようです。
アリエット2015年

回答:


320

更新:

解決策:windowActionModeOverlayプロパティを使用します。これをテーマに設定します。

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

アクションモードは、押し下げるのではなく、アクションバーの上に表示されます。(最新のAppCompatを使用していない場合は、プロパティに「android:」プレフィックスを追加する必要があります)。基本的に、AppCompatに、画面の上部にツールバーがあり、その上にActionModeを描画する必要があることを通知します。


古い回答/回避策:

私も同じ問題に遭遇しました。どのテーマを設定しても、ActionBarとして設定したツールバーは常に押し下げられます。サポートライブラリを使用して、または使用せずに試しましたが、問題ありませんでした。

残念ながら、私はそれを修正することができなかったので、代わりに回避策を構築しました。私ActionModeCallbackのでonCreateActionModeはアクションバーを非表示にします:

actionBarToolbar.setVisibility(View.GONE);

そしてonDestroyActionMode私はそれをもう一度見せます:

actionBarToolbar.setVisibility(View.VISIBLE);

非表示/表示が非常に迅速に行われるため、テストデバイスでは目立ちません。もちろん欠点もあります。Enterアニメーションは引き続き機能しますが、ツールバーがすぐにポップするため、コンテキストアクションバーのExitアニメーションは失われます。しかし、より良い解決策に出会うまでは、これで立ち往生していると思います。


(私のアクティビティは実際に、Google I / O 2014アプリのソースコードから取得したBaseActivityと呼ばれるメソッドを持つカスタムクラスを拡張しているため、簡単にツールバーを取得できます。getActionBarToolbar()

BaseActivity activity = (BaseActivity) getActivity();
activity.getActionBarToolbar().setVisibility(View.GONE);

残念ながら、I / Oアプリはコンテキストアクションバーを使用しません。)


ええ、これも私がたどり着ける唯一の解決策でした。ただし、Contextual ActionBarがシステムから発生する場合があります(たとえば、WebViewまたはEditTextで)。コールバックを取得しないもの。それで、それをどのように表示/非表示にしますか?(または、私は間違っていますが、実際には、CABのコールバックをそれらで取得できます)
アリエット2014年

1
はい、あなたはそのために彼の答えで説明されたAleksandarのように、そのためにTextView.setCustomSelectionActionModeCallback()をすることができます。
Jacob Ras

1
ああ、もうコメントは更新できません。小さな追加:setCustomSelectionActionModeCallbackは、サポートライブラリのActionModeCallbackと一緒に使用できないようです。VERSION.SDK_INTチェックを使用して設定しています。Honeycomb以前のデバイスでも問題が発生するかどうかをテストする必要があります。
Jacob Ras

@arietsは私の最新の答えを見てください。そのプロパティを完全に忘れてしまったことについては少し不満を感じますが、少なくとも今は回避策を取り除くことができます;-)
Jacob Ras

1
おかしい私は最新版を使用しています( 'com.android.support:appcompat-v7:22.0.0'をコンパイルします)。ただし、android:一部を
除外する必要があり

16

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

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

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

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

私にとってはandroid.support.v7.app.ActionBar
Frank

このエラーが表示されます
Faheem

あ、そう。私の最小バージョンは11以上です。そのため、android.view.ActionModeを使用できます。android.support.v7.widget.Toolbarでのコールバック、android.support.v7.view.ActionMode.Callbackを使用したことはありません。
フランク

メニュー項目のxmlのAppCompatActivity.startSupportActionMode(callback)ようapp:iconTintに属性との互換性を得るには、言及する価値があります。
geekley

14

ほんの少し追加:

<item name="windowActionModeOverlay">true</item>
動作するには、アクティビティで呼び出すsuper.onCreate(savedInstanceState) 前に呼び出すことが重要setContentView(R.layout.your_activity)です。この場合、本当に違いがあります!


11

私の場合は、 <item name="windowActionModeOverlay">true</item>動作しませんでしたが、この作品は:<item name="android:windowActionModeOverlay">true</item>androidキーです。


8
あなたは使う<item name="windowActionModeOverlay">true</item>そうでない場合は、使用、APPCOMPATツールバーでandroid名前空間を。
JavierMendonça15年

私のレイアウトでは使用しないツールバーを追加しています。アクティビティの初期化ツールバーとsetsupport trueで完了してください
Harsha

<item name = "windowActionModeOverlay"> true </ item>は期待どおりに機能しました。
フランソワ

8

Jacobのソリューションは私にとってはうまくいきましたが、コンテキストActionBarは透明で、ツールバーはそれを通して表示されました。これは次のように解決できます。

<style name="AppTheme.Base" parent="Theme.AppCompat.Light">
    ....
    ....
    <item name="actionModeStyle">@style/CustomActionMode</item>
</style>

<style name="CustomActionMode" parent="@style/Widget.AppCompat.ActionMode">
    <item name="background">@color/primary_material_light</item>
</style>

テーマ「AppTheme.Base」は、ツールバーに適用されるものである必要があります。

コンテキストに応じたActionBarスタイリングに関する詳細:

マテリアルデザインでappCompatを使用してコンテキストアクションバーをカスタマイズする方法


0

ツールバーを前面に表示する非常に便利な方法 toolbar.bringToFront()


2
View.bringToFront()は非常に重い操作であり、通常はいかなる場合でも回避する必要があります。
ドミナス

そうですが、アニメーションの場合、画面の上から下などはツールバーと重なります。したがって、toolbar.bringToFront()を使用して、toolbarの下をアニメーション化する必要があります。他の方法で共有できる場合:)
kunal.c

0

もう1つの小さな追加:setContentView(R.layout.empty_screen)UI全体をフラグメントで読み込む場合は、アクティビティで少なくとも空の画面を設定してください(ft.replace(android.R.id.content, fragment))。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.