浮动操作按钮固定在 ScrollView 和 Constraintlayout 中

Floating Action Button fixed in ScrollView and Constraintlayout

提问人:gojic 提问时间:7/28/2020 更新时间:7/28/2020 访问量:2384

问:

我有带有 ScrollView 的 xml 文件,该文件的子项为 Constraintlayout。我正在尝试的是使浮动操作按钮固定在屏幕上的同一位置,尽管滚动。 我试过和 .我还尝试将 FAB 放在 Constraintlayout 之外,但后来我遇到了一个错误,我的 ScrollView 不能有相乘子项。 android:layout_alignParentBottom="true" android:layout_alignParentEnd="true"layout_anchorGravity="@+id/root_leyaut"

我的 XML:

`<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

        <variable
            name="montlyBudgeting"
            type="com.nswd.successplan.ui.fragments.monthlyBudgetingFragment.MonthlyBudgetingViewModel" />
    </data>

    <androidx.core.widget.NestedScrollView
        android:id="@+id/root_leyaut"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/background"
        tools:context=".ui.fragments.monthlyBudgetingFragment.MonthlyBudgetingFragment">


        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <com.google.android.material.floatingactionbutton.FloatingActionButton
                android:id="@+id/fab"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="end|bottom"
                android:contentDescription="+"
                layout_anchorGravity="@+id/root_leyaut"
                android:layout_alignParentBottom="true"
                android:layout_alignParentEnd="true"
                android:src="@drawable/ic_arrow_drop_down"
                android:layout_marginBottom="8dp"
                android:layout_marginEnd="8dp"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent" />
<------------------------rest of code-------------------->
 </androidx.constraintlayout.widget.ConstraintLayout>
    </androidx.core.widget.NestedScrollView>
</layout>`
Android 浮动操作按钮 android-nestedscrollview

评论

0赞 einUsername 7/28/2020
我的答案对你有用吗?
1赞 gojic 7/28/2020
@einUsername它做到了。对不起,我的电脑周围没有:)

答:

3赞 einUsername 7/28/2020 #1

我不会使用 ScrollView 作为根布局。您可以使用第二个 ConstraintLayout,它将晶圆厂置于与 ScrollView 相同的“级别”。然后它不应该滚动,而应该留在角落里。以下代码应该可以工作,但我不得不注释掉你的一堆代码才能让它在我的电脑上运行......

<!--<layout xmlns:android="http://schemas.android.com/apk/res/android"-->
<!--    xmlns:app="http://schemas.android.com/apk/res-auto"-->
<!--    xmlns:tools="http://schemas.android.com/tools">-->

<!--    <data>-->

<!--        <variable-->
<!--            name="montlyBudgeting"-->
<!--            type="com.nswd.successplan.ui.fragments.monthlyBudgetingFragment.MonthlyBudgetingViewModel" />-->
<!--    </data>-->

<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_height="match_parent"
    android:layout_width="match_parent">

    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/fab"
        layout_anchorGravity="@+id/root_leyaut"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:layout_alignParentBottom="true"
        android:layout_gravity="end|bottom"
        android:contentDescription="+"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent" />

    <androidx.core.widget.NestedScrollView
        android:id="@+id/root_leyaut"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:context=".ui.fragments.monthlyBudgetingFragment.MonthlyBudgetingFragment">
        <!--        android:background="@color/background"-->


        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <!--            android:src="@drawable/ic_arrow_drop_down"-->
        </androidx.constraintlayout.widget.ConstraintLayout>
    </androidx.core.widget.NestedScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>
<!--</layout>-->
1赞 AagitoEx 7/28/2020 #2

如果不想滚动 FAB,请放置内部约束布局。NestedScrollingView

<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
       xmlns:app="http://schemas.android.com/apk/res-auto"
       xmlns:tools="http://schemas.android.com/tools"
       android:layout_width="match_parent"
       android:layout_height="wrap_content">

     <androidx.core.widget.NestedScrollView
        android:id="@+id/root_leyaut"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/background">

        <!-- Put your scrolling contents here, dont forget the constraints -->

     </androidx.core.widget.NestedScrollView>

     <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="end|bottom"
        android:contentDescription="+"
        layout_anchorGravity="@+id/root_leyaut"
        android:layout_alignParentBottom="true"
        android:layout_alignParentEnd="true"
        android:src="@drawable/ic_arrow_drop_down"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent" />
 </androidx.constraintlayout.widget.ConstraintLayout>

评论

0赞 einUsername 7/28/2020
请记住,如果他没有将 Layout 放入 NestedScrollView 中,并且它包含多个视图,他将再次收到相同的错误(ScrollView 只能承载一个直接子项)。