2つのウィジェット/レイアウトの間に新しい「フローティングアクションボタン」を追加するにはどうすればよいですか


287

新しい「フローティングアクションボタン」または「FAB」を備えた新しいAndroid設計ガイドラインを見たことがあると思います

たとえば、このピンクのボタン:

ここに画像の説明を入力してください

私の質問は愚かに聞こえますが、すでに多くのことを試しましたが、このボタンを2つのレイアウトの交差部分に配置する最良の方法は何ですか?

上記の例では、このボタンは、ImageViewと考えられるものとrelativeLayoutの間に完全に配置されています。

私はすでに多くの調整を試みましたが、それを行う適切な方法があると確信しています。


レイアウトをレイアウト内に配置し、ボタンをそのレイアウト上に配置することができます
Chrome Penguin Studios

1
このライブラリは大いに役立つと思います:github.com/ksoichiro/Android-ObservableScrollView
android developer

スクロール中に非表示にする方法は?ページをスクロールしてもfabが一番上に残り、隠れないという問題に直面しています。助けてください
Anish Kumar

回答:


473

ベストプラクティス:

  • compile 'com.android.support:design:25.0.1'Gradleファイルに追加
  • CoordinatorLayoutルートビューとして使用します。
  • layout_anchorFABに追加し、上面図に設定します
  • layout_anchorGravityFABに追加して、次のように設定します。bottom|right|end

ここに画像の説明を入力してください

<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <LinearLayout
            android:id="@+id/viewA"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="0.6"
            android:background="@android:color/holo_purple"
            android:orientation="horizontal"/>

        <LinearLayout
            android:id="@+id/viewB"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="0.4"
            android:background="@android:color/holo_orange_light"
            android:orientation="horizontal"/>

    </LinearLayout>

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="16dp"
        android:clickable="true"
        android:src="@drawable/ic_done"
        app:layout_anchor="@id/viewA"
        app:layout_anchorGravity="bottom|right|end"/>

</android.support.design.widget.CoordinatorLayout>

3
@Aprendiz引用もしたいのですが、これがHughJeffnerの答えよりも優れている理由がわかります。私はそれがよりシンプルで、より柔軟で、ハックが少ないと感じています。あなたはlayout_heightやマージンの値をハードコードしません。これらは時間によって変化したり、動的に定義されたりする可能性があります。ヒューの答えはいくつかの単純な例で働くことができ、そしておそらく完全には対応していないいくつかのサードパーティのライブラリの回避策かもしれないCoordinatorLayoutし、layout_anchorlayout_anchorGravity彼は、使っているものと同様、機能をfuturesimplesを
acrespo 2015

1
ところでfuturesimplesは AWESOMEライブラリであり、かつケースの誰かが不思議さに、この組み合わせフォークがありCoordinatorLayout、そのライブラリとのアプローチを見て。また、古いバージョンにはフォークもあります。
acrespo 2015

2
まさにこれを探していました。単純化のために+1。
Emiliano De Santis

29
これがすべてAndroidのドキュメントに記載されていないのはなぜですか?
モスタファ

3
app:layout_anchorを使用すると、レンダリングの問題が発生します(linearlayout layoutparamsをcoordinatorlayoutにキャストできません。:(
DAVIDBALAS1

91

この例での最もクリーンな方法は次のようです:

  • RelativeLayoutを使用する
  • 隣接する2つのビューを上下に配置します
  • FABを親の右/端に揃え、右/端のマージンを追加します
  • FABをヘッダービューの下部に揃えて、シャドウを含むFABの半分のサイズの負のマージンを追加します

シャーマンランドの実装から変更された例。好きなFABを使用してください。FABがシャドウを含めて64 dpの高さであると仮定します。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <View
        android:id="@+id/header"
        android:layout_width="match_parent"
        android:layout_height="120dp"
    />

    <View
        android:id="@+id/body"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/header"
    />

    <fully.qualified.name.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignBottom="@id/header"
        android:layout_marginBottom="-32dp"
        android:layout_marginRight="20dp"
    />

</RelativeLayout>

FABレイアウトの例


このレイアウトは私にとってはトリックでした!私はfuturesimpleで使用FABしています -追加と使用はかなり簡単で、お楽しみいただけます!
ローマ

「2つの隣接するビューを上下に配置する」とおっしゃったように、これが私が得た問題でした。「コンテナーレイアウト」が括弧が一致しないために混乱しているのを見落としていた:Dありがとう:P
マーティンフェファー

これは良い解決策ではありません。負のマージンは、ボタンのタッチターゲットの下半分を排除するようです。ファブの下半分を押してもクリックは記録されません。
Doronz、2015

1
@Doronzうーん、私はその問題を持っていないようです。あなたの見解は正しい順序であり、すなわちFABが最上位層ですか?
ヒュージェフナー、2015

23
android:layout_marginBottom = "-32dp"ボタンのwrap_contentがハードコードされた値は不適切なソリューション
レスター

51

GoogleのサンプルプロジェクトをAndroid Studioにインポートするには、[ファイル]> [サンプルのインポート...]をクリックします。

サンプルをインポート

このサンプルには、FrameLayoutから継承したFloatingActionButtonビューが含まれています。

新しいサポートデザインライブラリで編集すると、次の例のように実装できます。https//github.com/chrisbanes/cheesesquare


1
実行するにはandroid-21が必要です。
Yuliia Ashomok 2015年

FloatingActionButtonを使用する場合は、サポートデザインライブラリを使用する必要があります。Googleのチーズスクエアをご覧ください。
Roel、2015年

16

AppCompat 22では、古いデバイスでFABがサポートされています。

build.gradle(app)に新しいサポートライブラリを追加します。

compile 'com.android.support:design:22.2.0'

次に、それをxmlで使用できます。

<android.support.design.widget.FloatingActionButton
    android:id="@+id/fab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom|end"
    android:src="@android:drawable/ic_menu_more"
    app:elevation="6dp"
    app:pressedTranslationZ="12dp" />

使用するelevationpressedTranslationZプロパティは、名前空間がapp必要とされているので、あなたのレイアウトにこの名前空間を追加します。 xmlns:app="http://schemas.android.com/apk/res-auto"


3
app名前空間に関する情報を追加
Lukasz 'Severiaan' Grela

14

現在は、公式のデザインサポートライブラリの一部です。

あなたのグラドルで:

compile 'com.android.support:design:22.2.0'

http://developer.android.com/reference/android/support/design/widget/FloatingActionButton.html


5
あなたの答えは少し不明瞭で曖昧です。DSLの一部をさらに説明し、そのページから関連情報を引用してください。
SuperBiasedMan 2015年

申し訳ありませんが、外部ライブラリへの参照をたくさん見たので、公式ライブラリを指摘したいと思います。ライブラリはボタンを作成することしかできませんが、配置は開発者にあります。したがって、私の投稿はあまり関連性がありません。
Veronnie

12

このライブラリjavadocはこちら)を試してください。最小APIレベルは7です。

dependencies {
    compile 'com.shamanland:fab:0.0.8'
}

テーマ、xml、またはjava-codeを介してカスタマイズする機能を備えた単一のウィジェットを提供します。

光 の間に

使い方はとても簡単です。利用可能であるnormalmini実装がに従って推進アクションパターン。

<com.shamanland.fab.FloatingActionButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_action_my"
    app:floatingActionButtonColor="@color/my_fab_color"
    app:floatingActionButtonSize="mini"
    />

コンパイルしようとするデモアプリケーションを。徹底的な例があります:withを使用して明るいテーマと暗いテーマが2つのビューの間ListViewに配置されます。


3
この回答に追加するだけです^ github.com/FaizMalkani/FloatingActionButton、およびgithub.com/makovkastar/FloatingActionButtonなどの他の利用可能なバックポートライブラリを使用することもできます。どちらもより多くのバッキングを持っているように見えるかもしれません。ただし、この回答にリストされているソースから詳細ビューに従ってください。よく働く。
ジョンシェリー

公式図書館ですか?
Cocorico

公式図書館はありません。これはオープンソースの私のlibです。
Oleksii K. 2014

このフローティングアクションボタンは、実装方法の悪い例です。それは真の材料設計ガイドラインに従っていません。
マイケル

@マイク・ミラ、このlibの何が問題になっていますか?どの要件が満たされていませんか?
Oleksii K.


6

丸みを帯びたxmlの背景を与えることにより、TextViewを使用してフローティングアクションボタンを追加することをシンプルにします。com.android.support:design:23.1.1-gradleファイルにコンパイルを追加

  • ルートビューとしてCoordinatorLayoutを使用します。
  • CoordinatorLayoutを終了する前に、textViewを紹介します。
  • Drawableの内側に円を描きます。

サークルXMLは

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">

    <solid
        android:color="@color/colorPrimary"/>
    <size
        android:width="30dp"
        android:height="30dp"/>
</shape>

レイアウトxmlは

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:weightSum="5"
    >

    <RelativeLayout
        android:id="@+id/viewA"
        android:layout_height="0dp"
        android:layout_width="match_parent"
        android:layout_weight="1.6"
        android:background="@drawable/contact_bg"
        android:gravity="center_horizontal|center_vertical"
        >
        </RelativeLayout>

    <LinearLayout
        android:layout_height="0dp"
        android:layout_width="match_parent"
        android:layout_weight="3.4"
        android:orientation="vertical"
        android:padding="16dp"
        android:weightSum="10"
        >

        <LinearLayout
            android:layout_height="0dp"
            android:layout_width="match_parent"
            android:layout_weight="1"
            >
            </LinearLayout>

        <LinearLayout
            android:layout_height="0dp"
            android:layout_width="match_parent"
            android:layout_weight="1"
            android:weightSum="4"
            android:orientation="horizontal"
            >
            <TextView
                android:layout_height="match_parent"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:text="Name"
                android:textSize="22dp"
                android:textColor="@android:color/black"
                android:padding="3dp"
                />

            <TextView
                android:id="@+id/name"
                android:layout_height="match_parent"
                android:layout_width="0dp"
                android:layout_weight="3"
                android:text="Ritesh Kumar Singh"
                android:singleLine="true"
                android:textSize="22dp"
                android:textColor="@android:color/black"
                android:padding="3dp"
                />

            </LinearLayout>



        <LinearLayout
            android:layout_height="0dp"
            android:layout_width="match_parent"
            android:layout_weight="1"
            android:weightSum="4"
            android:orientation="horizontal"
            >
            <TextView
                android:layout_height="match_parent"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:text="Phone"
                android:textSize="22dp"
                android:textColor="@android:color/black"
                android:padding="3dp"
                />

            <TextView
                android:id="@+id/number"
                android:layout_height="match_parent"
                android:layout_width="0dp"
                android:layout_weight="3"
                android:text="8283001122"
                android:textSize="22dp"
                android:textColor="@android:color/black"
                android:singleLine="true"
                android:padding="3dp"
                />

        </LinearLayout>



        <LinearLayout
            android:layout_height="0dp"
            android:layout_width="match_parent"
            android:layout_weight="1"
            android:weightSum="4"
            android:orientation="horizontal"
            >
            <TextView
                android:layout_height="match_parent"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:text="Email"
                android:textSize="22dp"
                android:textColor="@android:color/black"
                android:padding="3dp"
                />

            <TextView
                android:layout_height="match_parent"
                android:layout_width="0dp"
                android:layout_weight="3"
                android:text="ritesh.singh@betasoftsystems.com"
                android:textSize="22dp"
                android:singleLine="true"
                android:textColor="@android:color/black"
                android:padding="3dp"
                />

        </LinearLayout>


        <LinearLayout
            android:layout_height="0dp"
            android:layout_width="match_parent"
            android:layout_weight="1"
            android:weightSum="4"
            android:orientation="horizontal"
            >
            <TextView
                android:layout_height="match_parent"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:text="City"
                android:textSize="22dp"
                android:textColor="@android:color/black"
                android:padding="3dp"
                />

            <TextView
                android:layout_height="match_parent"
                android:layout_width="0dp"
                android:layout_weight="3"
                android:text="Panchkula"
                android:textSize="22dp"
                android:textColor="@android:color/black"
                android:singleLine="true"
                android:padding="3dp"
                />

        </LinearLayout>

    </LinearLayout>

</LinearLayout>


    <TextView
        android:id="@+id/floating"
        android:transitionName="@string/transition_name_circle"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_margin="16dp"
        android:clickable="false"
        android:background="@drawable/circle"
        android:elevation="10dp"
        android:text="R"
        android:textSize="40dp"
        android:gravity="center"
        android:textColor="@android:color/black"
        app:layout_anchor="@id/viewA"
        app:layout_anchorGravity="bottom"/>

        </android.support.design.widget.CoordinatorLayout>

どのように見えるかを確認するには、ここをクリックしてください


5

これをgradleファイルに追加してください

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.0.0'
    compile 'com.android.support:design:23.0.1'
}

これをあなたのactivity_main.xmlに

<android.support.design.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <LinearLayout
                android:id="@+id/viewOne"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_weight="0.6"
                android:background="@android:color/holo_blue_light"
                android:orientation="horizontal"/>

            <LinearLayout
                android:id="@+id/viewTwo"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_weight="0.4"
                android:background="@android:color/holo_orange_light"
                android:orientation="horizontal"/>

        </LinearLayout>

        <android.support.design.widget.FloatingActionButton
            android:id="@+id/floatingButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="16dp"
            android:clickable="true"
            android:src="@drawable/ic_done"
            app:layout_anchor="@id/viewOne"
            app:layout_anchorGravity="bottom|right|end"
            app:backgroundTint="#FF0000"
            app:rippleColor="#FFF" />

    </android.support.design.widget.CoordinatorLayout>

android studioプロジェクトの完全な例はhttp://www.ahotbrew.com/android-floating-action-button/からダウンロードできます。


1

ここに作業コードがあります。

私はappBarLayoutを使用して、floatingActionButtonをアンカーします。これがお役に立てば幸いです。

XMLコード。

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_height="192dp"
        android:layout_width="match_parent">

        <android.support.design.widget.CollapsingToolbarLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:toolbarId="@+id/toolbar"
            app:titleEnabled="true"
            app:layout_scrollFlags="scroll|enterAlways|exitUntilCollapsed"
            android:id="@+id/collapsingbar"
            app:contentScrim="?attr/colorPrimary">

            <android.support.v7.widget.Toolbar
                app:layout_collapseMode="pin"
                android:id="@+id/toolbarItemDetailsView"
                android:layout_height="?attr/actionBarSize"
                android:layout_width="match_parent"></android.support.v7.widget.Toolbar>
        </android.support.design.widget.CollapsingToolbarLayout>
    </android.support.design.widget.AppBarLayout>

    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="android.support.design.widget.AppBarLayout$ScrollingViewBehavior">

        <android.support.constraint.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context="com.example.rktech.myshoplist.Item_details_views">
            <RelativeLayout
                android:orientation="vertical"
                android:focusableInTouchMode="true"
                android:layout_width="match_parent"
                android:layout_height="match_parent">


                <!--Put Image here -->
                <ImageView
                    android:visibility="gone"
                    android:layout_marginTop="56dp"
                    android:layout_width="match_parent"
                    android:layout_height="230dp"
                    android:scaleType="centerCrop"
                    android:src="@drawable/third" />


                <ScrollView
                    android:layout_width="match_parent"
                    android:layout_height="match_parent">

                    <RelativeLayout
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:layout_gravity="center"
                        android:orientation="vertical">

                        <android.support.v7.widget.CardView
                            android:layout_width="match_parent"
                            android:layout_height="match_parent"
                            app:cardCornerRadius="4dp"
                            app:cardElevation="4dp"
                            app:cardMaxElevation="6dp"
                            app:cardUseCompatPadding="true">

                            <RelativeLayout
                                android:layout_width="match_parent"
                                android:layout_height="match_parent"
                                android:layout_margin="8dp"
                                android:padding="3dp">


                                <LinearLayout
                                    android:layout_width="match_parent"
                                    android:layout_height="match_parent"
                                    android:orientation="vertical">


                                    <TextView
                                        android:id="@+id/txtDetailItemTitle"
                                        style="@style/TextAppearance.AppCompat.Title"
                                        android:layout_width="match_parent"
                                        android:layout_height="wrap_content"
                                        android:layout_marginLeft="4dp"
                                        android:text="Title" />

                                    <LinearLayout
                                        android:layout_width="match_parent"
                                        android:layout_height="match_parent"
                                        android:layout_marginTop="8dp"
                                        android:orientation="horizontal">

                                        <TextView
                                            android:id="@+id/txtDetailItemSeller"
                                            style="@style/TextAppearance.AppCompat.Subhead"
                                            android:layout_width="wrap_content"
                                            android:layout_height="wrap_content"
                                            android:layout_marginLeft="4dp"
                                            android:layout_weight="1"
                                            android:text="Shope Name" />

                                        <TextView
                                            android:id="@+id/txtDetailItemDate"
                                            style="@style/TextAppearance.AppCompat.Subhead"
                                            android:layout_width="wrap_content"
                                            android:layout_height="wrap_content"
                                            android:layout_marginRight="4dp"
                                            android:gravity="right"
                                            android:text="Date" />


                                    </LinearLayout>

                                    <TextView
                                        android:id="@+id/txtDetailItemDescription"
                                        style="@style/TextAppearance.AppCompat.Medium"
                                        android:layout_width="match_parent"
                                        android:minLines="5"
                                        android:layout_height="wrap_content"
                                        android:layout_marginLeft="4dp"
                                        android:layout_marginTop="16dp"
                                        android:text="description" />

                                    <LinearLayout
                                        android:layout_width="match_parent"
                                        android:layout_height="wrap_content"
                                        android:layout_marginBottom="8dp"
                                        android:orientation="horizontal">

                                        <TextView
                                            android:id="@+id/txtDetailItemQty"
                                            style="@style/TextAppearance.AppCompat.Medium"
                                            android:layout_width="wrap_content"
                                            android:layout_height="wrap_content"
                                            android:layout_marginLeft="4dp"
                                            android:layout_weight="1"
                                            android:text="Qunatity" />

                                        <TextView
                                            android:id="@+id/txtDetailItemMessure"
                                            style="@style/TextAppearance.AppCompat.Medium"
                                            android:layout_width="wrap_content"
                                            android:layout_height="wrap_content"
                                            android:layout_marginRight="4dp"
                                            android:layout_weight="1"
                                            android:gravity="right"
                                            android:text="Messure in Gram" />
                                    </LinearLayout>


                                    <TextView
                                        android:id="@+id/txtDetailItemPrice"
                                        style="@style/TextAppearance.AppCompat.Headline"
                                        android:layout_width="match_parent"
                                        android:layout_height="wrap_content"
                                        android:layout_marginRight="4dp"
                                        android:layout_weight="1"
                                        android:gravity="right"
                                        android:text="Price" />
                                </LinearLayout>

                            </RelativeLayout>
                        </android.support.v7.widget.CardView>
                    </RelativeLayout>
                </ScrollView>
            </RelativeLayout>

        </android.support.constraint.ConstraintLayout>

    </android.support.v4.widget.NestedScrollView>

    <android.support.design.widget.FloatingActionButton
        android:layout_width="wrap_content"
        app:layout_anchor="@id/appbar"
        app:fabSize="normal"
        app:layout_anchorGravity="bottom|right|end"
        android:layout_marginEnd="@dimen/_6sdp"
        android:src="@drawable/ic_done_black_24dp"
        android:layout_height="wrap_content" />

</android.support.design.widget.CoordinatorLayout>

ここで、上記のコードを貼り付けます。デバイスで次の結果が表示されます。 結果画像

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