web-dev-qa-db-ja.com

AppCompat-v7を使用したツールバーとコンテキストアクションバー

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

したがって、本質的には、このように設定します。 includeタグで使用する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がツールバーの上に表示されるようにする方法を知っている人はいますか?

Toolbar and Contextual ActionBar

177
ariets

更新:

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

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

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


古い回答/回避策:

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

残念ながら、修正することができなかったため、代わりに回避策を作成しました。 ActionModeCallbackonCreateActionModeで、アクションバーを非表示にします。

actionBarToolbar.setVisibility(View.GONE);

そしてonDestroyActionModeIにもう一度表示します:

actionBarToolbar.setVisibility(View.VISIBLE);

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


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

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

I/Oアプリがコンテキストアクションバーを使用しないのは残念です。)

316
Jacob Ras

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

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

使用する必要があります

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

私の場合、<item name="windowActionModeOverlay">true</item>didは機能しませんが、この機能:<item name="Android:windowActionModeOverlay">true</item>Androidがキーです。

11
Jenkyn

Jacobのソリューションは私にとってはうまくいきましたが、コンテキストアクションバーは透明であり、ツールバーはそこから見えます。これは次のように解決できます。

<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」は、ツールバーに適用されるものでなければなりません。

コンテキストアクションバーのスタイリングに関する詳細:

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

8
Pete

別の小さな追加:UI全体をフラグメント(setContentView(R.layout.empty_screen))でロードする場合は、ft.replace(Android.R.id.content, fragment)を介してアクティビティで少なくとも空の画面を設定するようにしてください。

0
Andreas Wenger

ツールバーを前面に表示する非常に便利なメソッドtoolbar.bringToFront()

0
kunal.c