Как я могу добавить новую "плавающую кнопку действия" между двумя виджетами / макетами
Я думаю, вы видели новые рекомендации по дизайну Android, с новой "плавающей Кнопкой действия" a.k. A "FAB"
например эта розовая кнопка:
мой вопрос звучит глупо, и я уже пробовал много вещей, но каков лучший способ поставить эту кнопку на пересечении двух макетов?
в приведенном выше примере эта кнопка идеально расположена между тем, что мы можем себе представить как ImageView и a относительно спокойно.
Я уже пробовал много настроек, но я убежден, что это правильный способ сделать это.
10 ответов:
рекомендация:
- добавить
compile 'com.android.support:design:25.0.1'
для gradle file- использовать
CoordinatorLayout
в качестве корневого вид.- добавить
layout_anchor
к FAB и установите его на вид сверху- добавить
layout_anchorGravity
к FAB и установите его в: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>
Кажется, что самый чистый способ в этом примере:
- используйте RelativeLayout
- расположите 2 смежных вида один под другим
- выровняйте FAB по родительскому правому краю и добавьте правое/конечное поле
- выровняйте FAB в нижней части представления заголовка и добавьте отрицательный маржа, половина размера FAB включая тень
пример адаптирован из реализации shamanland, используйте любой FAB ты желаешь. Предположим, что FAB имеет 64dp высокий, включая тень:
<?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>
вы можете импортировать пример проекта Google в Android Studio, нажав файл > импорт образца...
этот пример содержит представление FloatingActionButton, которое наследуется от FrameLayout.
Edit С помощью новой библиотеки проектирования поддержки вы можете реализовать ее, как в этом примере: https://github.com/chrisbanes/cheesesquare
С AppCompat 22, FAB поддерживается для старых устройств.
добавьте новую библиотеку поддержки в свою сборку.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" />
использовать
elevation
иpressedTranslationZ
свойства, пространства именapp
нужно, чтобы добавить пространство имен для вашего макета:xmlns:app="http://schemas.android.com/apk/res-auto"
теперь это часть официальной библиотеки поддержки дизайна.
в вашем gradle:
compile 'com.android.support:design:22.2.0'
http://developer.android.com/reference/android/support/design/widget/FloatingActionButton.html
попробовать библиотека (javadoc здесь), минимальный уровень API составляет 7:
dependencies { compile 'com.shamanland:fab:0.0.8' }
он предоставляет один виджет с возможностью настройки его через тему, xml или java-код.
Он очень прост в использовании. Есть в наличии
normal
иmini
реализация согласно Поощрять Действия узор.<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" />
попробуйте скомпилировать демо приложения. Есть все пример: светлые и темные темы, используя с
ListView
,выравнивание между двумя видами.
вот один aditional бесплатно плавающая библиотека кнопок действий для Android. Он имеет много настроек и требует SDK версии 9 и выше
dependencies { compile 'com.scalified:fab:1.1.2' }
сохранить его простым Добавление плавающей кнопки действия с помощью TextView, давая округленный фон xml. - Добавить компиляцию
com.android.support:design:23.1.1
для gradle file
- использовать 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>
добавьте это в ваш файл 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/
вот рабочий код.
я использую 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>
теперь, если вы вставляете выше код. вы увидите следующий результат на вашем устройстве.