2016-09-08 3 views
8

У меня есть плавающие кнопки действий в двух моих макетах фрагментов, и иногда они перемещаются в неправильное положение, хотя я использую CoordinatorLayout.Android: плавающая кнопка действия в неправильном положении

This is how it should look

This is how it somtetimes look when i open the Fragment

Это код моего фрагмента:

<?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"> 

<LinearLayout android:id="@+id/notes_layout" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".fragments.NotesFragment"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/notes_recycler_view" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 

</LinearLayout> 

<android.support.design.widget.FloatingActionButton 
    android:id="@+id/new_note_button" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_margin="16dp" 
    android:clickable="true" 
    android:src="@drawable/ic_add_black_48dp" 
    app:layout_anchor="@id/notes_layout" 
    app:layout_anchorGravity="bottom|center" 
    android:onClick="openNewNote"/> 

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

Кто-нибудь есть идея, почему FAB иногда двигаться в неправильном положении?

+0

согласно вашему XML есть вид утилизатора, но скриншот показывает TextView? –

+0

@Sangram textview - это ViewHolder. Он отображается, когда просмотр ресайклера пуст. – Cimoe

+0

вы также можете программно настроить гравитацию на FAB.check мой ответ. –

ответ

6

Я столкнулся с тем же вопросом. Проблема заключается в сочетании приложения: layout_anchor и com.android.support.design:24.2.0+

Я смог исправить эту проблему, удалив приложение app: layout_anchor из фабрики или вернувшись к более старой версии библиотеки дизайна. 24.1.1 работал отлично для меня. Мне также пришлось отменить мою библиотеку appcompat v7 до 24.1.1.

Надеюсь, это поможет.

+0

Я могу подтвердить ту же проблему, я смог решить, удалив приложение: layout_anchor – gpiazzese

2

Класс CoordinatorLayout.LayoutParams имеет поле anchorGravity. Например:

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams) fab.getLayoutParams(); 
lp.anchorGravity = Gravity.BOTTOM | GravityCompat.START; 
fab.setLayoutParams(lp); 
+0

Спасибо за идею, но она все еще не работает ,Fab все еще перемещается случайно в неправильное положение – Cimoe

1

В моем случае это была ошибка в библиотеке поддержки с 24.2.0 и выше. Таким образом, единственный способ обходного пути - создать приложение с поддержкой lib v24.1.1.

1
try this: 
<android.support.design.widget.CoordinatorLayout 
     android:id="@+id/main_content" 
     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"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/rvToDoList" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"></android.support.v7.widget.RecyclerView> 

    <android.support.design.widget.FloatingActionButton 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom|right" 
     android:layout_margin="16dp" 
     android:src="@mipmap/ic_launcher" 
     app:layout_anchor="@id/rvToDoList" 
     app:layout_anchorGravity="bottom|right|end"/> 
</android.support.design.widget.CoordinatorLayout> 
6

Попробуйте сделать FAB первого ребенка CoordinatorLayout

+0

У меня очень похожая компоновка и перемещение FAB, чтобы быть первым ребенком, невозможно, как будет ли атрибут layout_anchor работать как теперь перед LinearLayout? – Phil

+0

layout_anchor должен работать в любом случае, независимо от того, находится ли он над или под фиксированным представлением. Единственным ограничением является то, что родительский элемент, который имеет атрибут layout_anchor, должен быть координаторомLayout –

+0

по какой-то странной причине, которая работает! – Jelle

0

Ни одно из этих предложений не в конечном итоге работает для меня (понижение не вариант, перемещая FAB так это первый ребенок делает его невидимым на Android 14, удаление layout_anchor заставляет его постоянно переходить в случайную позицию)

Я вместо этого использовал ConstraintLayout для позиционирования FAB вручную между двумя видами, в которых я хотел. Так как весь экран моего не имеет области прокрутки, это отлично работает.

Чтобы расположить FAB таким образом, установите его верхнее и нижнее ограничение в нижней части одного из верхних видов, которое предполагается перекрывать, и убедитесь, что это последний ребенок в ConstraintLayout.

0

Поместите FAB внутри RelativeLayout, он работал на меня, я использую версию 25.3.1 опорной библиотеки

Смежные вопросы