使用可滚动的 ActionBar 始终显示元素

Posted

技术标签:

【中文标题】使用可滚动的 ActionBar 始终显示元素【英文标题】:Element shown all the time with scrollable ActionBar 【发布时间】:2022-01-18 15:29:38 【问题描述】:

我有显示元素列表的活动,以允许用户选择其中一个。此活动(与应用程序中的所有其他活动相同)具有 ActionBar 和活动标题。此栏是可滚动的,因此当用户向下滚动列表时,它会消失以在屏幕上显示更多元素。我喜欢这个功能,但我需要在屏幕末尾添加CheckBox。没错,活动开始后,它显示在屏幕下方,用户必须向下滚动才能看到它。是否可以使从一开始就显示的复选框并且仅将列表扩展到ActionBar的空间?

启动后的活动,其中复选框在屏幕下方不可见:

向下滚动后的活动:

预期结果 - 从一开始就显示复选框

我的布局代码很简单:

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

    <FrameLayout
        android:id="@+id/pnSearch"
        android:layout_
        android:layout_>

        <EditText
            android:layout_
            android:layout_
            android:id="@+id/edSearch"
            android:layout_gravity="center_horizontal"
            android:inputType="text"
            android:drawableLeft="@android:drawable/ic_menu_search"
            android:maxLines="1" />

        <ImageButton
            android:id="@+id/btnSearchClear"
            android:layout_
            android:layout_
            android:layout_marginRight="10dp"
            android:layout_marginEnd="10dp"
            android:layout_gravity="end|center_vertical"
            android:background="@android:drawable/ic_menu_close_clear_cancel"
            android:contentDescription="@null" />
    </FrameLayout>

    <ListView
        android:id="@+id/listView"
        android:layout_
        android:layout_
        android:layout_weight="1" />

    <LinearLayout
        android:id="@+id/pnShowOnlyAvailable"
        android:layout_
        android:layout_
        android:layout_gravity="bottom">

        <CheckBox
            android:id="@+id/chbShowOnlyAvailable"
            android:layout_
            android:layout_
            android:focusable="false"
            android:padding="10dp"
            android:focusableInTouchMode="false"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:text="@string/title_show_only_available"/>

    </LinearLayout>

</LinearLayout>

【问题讨论】:

使用 RelativeLayoutConstraintLayout ,目前您正在使用 LinearLayout (所有项目都以线性方式,即彼此下方)。 感谢您的建议。我尝试将布局重写为 ConstraintLayout 并使用 CheckBox 约束到父底部,但行为仍然相同 【参考方案1】:

您可以尝试使用RelativeLayout 而不是LinearLayout,并将您的视图的android:layout_alignParentBottom 参数设置为true

类似这样的:

<?xml version="1.0" encoding="utf-8"?>
<!-- RelativeLayout instead of LinearLayout -->
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_>

    <FrameLayout
        android:id="@+id/pnSearch"
        android:layout_
        android:layout_>

        <EditText
            android:layout_
            android:layout_
            android:id="@+id/edSearch"
            android:layout_gravity="center_horizontal"
            android:inputType="text"
            android:drawableLeft="@android:drawable/ic_menu_search"
            android:maxLines="1" />

        <ImageButton
            android:id="@+id/btnSearchClear"
            android:layout_
            android:layout_
            android:layout_marginRight="10dp"
            android:layout_marginEnd="10dp"
            android:layout_gravity="end|center_vertical"
            android:background="@android:drawable/ic_menu_close_clear_cancel"
            android:contentDescription="@null" />
    </FrameLayout>

    <!-- height edited to "match_parent", weight removed-->
    <ListView
        android:id="@+id/listView"
        android:layout_
        android:layout_
        android:layout_below="@id/pnSearch"/>

    <!-- layout_alignParentBottom parameter added  -->
    <LinearLayout
        android:id="@+id/pnShowOnlyAvailable"
        android:layout_
        android:layout_
        android:layout_alignParentBottom="true">

        <CheckBox
            android:id="@+id/chbShowOnlyAvailable"
            android:layout_
            android:layout_
            android:focusable="false"
            android:padding="10dp"
            android:focusableInTouchMode="false"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:text="@string/title_show_only_available"/>

    </LinearLayout>

</RelativeLayout>

【讨论】:

以上是关于使用可滚动的 ActionBar 始终显示元素的主要内容,如果未能解决你的问题,请参考以下文章

如何强制 div 始终可滚动?

滚动时始终在屏幕底部显示 LinearLayout 中的按钮

ActionBar 中的选项卡数

javascript中如可控制iframe的滚动条位置

javascript中如可控制iframe的滚动条位置

每个滚动同步元素仅显示一个滚动条