如何避免元素重叠在RelativeLayout上显示软键盘

Posted

技术标签:

【中文标题】如何避免元素重叠在RelativeLayout上显示软键盘【英文标题】:How to avoid elements overlapping showing softkeyboard on RelativeLayout 【发布时间】:2013-07-28 11:49:05 【问题描述】:

我在这里阅读了很多帖子,但似乎无法找到如何做到这一点。

我正在尝试创建以下布局 xml。

在中间我想要一个LinearLayout,里面有一些按钮,在LinearLayout的顶部和开头之间我想要一个textView

LinearLayout 位于 ScrollView 中,而 ScrollView 位于 RelativeLayout

我通过将LinearLayoutTextView 放在RelativeLayout 中来实现这一点。 LinearLayout 位于父项的中心,textView 位于 linearLayout 上方并位于父项的顶部。文本垂直居中。

问题在于keyboard 何时开启。我只将LinearLayout 放在ScrollView 中。 如果我在manifest 中使用adjustPan,那么什么也不会发生,我不能scroll。如果我使用adjustResize,那么Textview 会出现在LinearLayout 的顶部而不是上面。那我该怎么办?还是不可能? 如果需要,我只希望linearLayout 成为scrollable。 代码如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:background="@color/black_overlay"
    android:animateLayoutChanges="true"
    android:hapticFeedbackEnabled="true"
    android:layout_
    android:layout_>

    <ScrollView
        android:layout_
        android:layout_
        android:fillViewport="true"
        android:layout_centerInParent="true"
        android:id="@+id/scrollView">

        <LinearLayout
            android:layout_
            android:layout_
            android:orientation="vertical"
            android:layout_gravity="center_horizontal"
            android:id="@+id/mLayout">

            <Button
                android:layout_marginBottom="10dp"
                android:layout_
                android:layout_
                android:text="New Match"
                android:id="@+id/btn_newMatch"
                style="@style/ButtonBar"
                android:typeface="monospace"/>

            <Button
                android:layout_marginBottom="10dp"
                android:layout_
                android:layout_
                android:text="Manage Matches"
                android:id="@+id/btn_manageMatches"
                style="@style/ButtonBar"
                android:typeface="monospace"/>

            <Button
                android:layout_marginBottom="10dp"
                android:layout_
                android:layout_
                android:text="Manage Teams"
                android:id="@+id/btn_manageTeams"
                style="@style/ButtonBar"
                android:typeface="monospace"/>

            <Button
                android:layout_marginBottom="10dp"
                android:layout_
                android:layout_
                android:text="Settings"
                android:id="@+id/btn_settings"
                style="@style/ButtonBar"
                android:typeface="monospace"/>

            <Button
                android:layout_
                android:layout_
                android:text="Logout"
                android:id="@+id/btn_logout"
                style="@style/ButtonBar"
                android:typeface="monospace"/>
        </LinearLayout>
    </ScrollView>
    <TextView
        android:layout_
        android:layout_
        android:layout_centerHorizontal="true"
        android:text="Name"
        android:typeface="monospace"
        android:layout_above="@id/scrollView"
        android:layout_alignParentTop="true"
        android:gravity="center"
        android:textSize="50dp"
        android:textAppearance="?android:textAppearanceMediumInverse"
        android:layout_marginBottom="10dp"
        android:layout_marginTop="10dp"/>
</RelativeLayout>

这是当前使用 adjustResize 的样子:

没有键盘:

带键盘:

谁能指出我正确的方向?

谢谢!!! :)

【问题讨论】:

【参考方案1】:

添加这个

android:windowSoftInputMode="adjustPan|stateHidden"

在清单中的活动声明处。

【讨论】:

使用 adjustPan 屏幕不会调整大小。键盘保持在布局的顶部,因此布局不会重叠,但也不会滚动。 能否请您详细说明您的问题..!你到底想要什么? 我真正想要的是布局调整到最小高度,没有任何东西重叠并变得可滚动。但是在阅读了很多之后,我认为这是不可能的。所以我希望它可以滚动以避免我在图像上显示的重叠。【参考方案2】:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:animateLayoutChanges="true"
    android:background="@android:color/darker_gray"
    android:hapticFeedbackEnabled="true" >

    <EditText
        android:id="@+id/etName"
        android:layout_
        android:layout_
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="10dp"
        android:layout_marginTop="10dp"
        android:gravity="center" />

    <ScrollView
        android:id="@+id/scrollView"
        android:layout_
        android:layout_
        android:layout_below="@+id/etName"
        android:layout_centerInParent="true"
        android:fillViewport="true" >

        <LinearLayout
            android:id="@+id/mLayout"
            android:layout_
            android:layout_
            android:layout_gravity="center_horizontal"
            android:orientation="vertical" >

            <Button
                android:id="@+id/btn_newMatch"
                android:layout_
                android:layout_
                android:layout_marginBottom="10dp"
                android:text="New Match"
                android:typeface="monospace" />

            <Button
                android:id="@+id/btn_manageMatches"
                android:layout_
                android:layout_
                android:layout_marginBottom="10dp"
                android:text="Manage Matches"
                android:typeface="monospace" />

            <Button
                android:id="@+id/btn_manageTeams"
                android:layout_
                android:layout_
                android:layout_marginBottom="10dp"
                android:text="Manage Teams"
                android:typeface="monospace" />

            <Button
                android:id="@+id/btn_settings"
                android:layout_
                android:layout_
                android:layout_marginBottom="10dp"
                android:text="Settings"
                android:typeface="monospace" />

            <Button
                android:id="@+id/btn_logout"
                android:layout_
                android:layout_
                android:text="Logout"
                android:typeface="monospace" />
        </LinearLayout>
    </ScrollView>

</RelativeLayout>

在活动标签中的清单中

 android:windowSoftInputMode="adjustResize|stateHidden"

【讨论】:

【参考方案3】:

为了防止在我的RelativeLayout 中显示键盘时视图垂直重叠 - 只需添加边距即可解决问题

android:layout_marginTop="25dp"

【讨论】:

以上是关于如何避免元素重叠在RelativeLayout上显示软键盘的主要内容,如果未能解决你的问题,请参考以下文章

TextView在RelativeLayout中重叠ImageView

在relativelayout中布局,两个控件重叠,放在后面得viewpager点击滑动事件都无效了

避免显示时绝对位置隐藏的元素重叠元素

RelativeLayout中include 控件覆盖重叠的问题

动态添加的视图在相对布局中重叠

让RelativeLayout(相对布局)不重叠