【问题标题】:Move layouts up when soft keyboard is shown?显示软键盘时向上移动布局?
【发布时间】:2010-12-30 04:53:52
【问题描述】:

我在设置了 align bottom 属性的 RelativeView 中有一些元素,当软键盘出现时,这些元素被软键盘隐藏。

我希望它们向上移动,这样如果屏幕空间足够,它们就会显示在键盘上方,或者让键盘上方的部分可滚动,以便用户仍然可以看到元素。

关于如何解决这个问题的任何想法?

【问题讨论】:

标签: android user-interface android-layout android-keypad


【解决方案1】:

是的,请查看 this article on the Android developers' site,它描述了框架如何处理出现的软键盘。

@987654322@ 属性可用于指定每个活动发生的情况:是否调整布局大小或是否滚动等。

【讨论】:

    【解决方案2】:

    您也可以在onCreate()方法中使用此代码:

    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
    

    【讨论】:

    • 对我来说,即使我设置了 adjustPan screnn 也只能移动到我点击的编辑文本,而不是整个布局
    【解决方案3】:

    为您的活动添加 AndroidManifest.xml:

    android:windowSoftInputMode="adjustPan|adjustResize"
    

    【讨论】:

    【解决方案4】:

    更改清单文件的活动,例如

    android:windowSoftInputMode="adjustResize"
    

    在活动类中更改onCreate() 方法,例如

    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
    

    【讨论】:

    • 为什么要使用不同的标志?
    • 当前版本需要android前缀:android:windowSoftInputMode="adjustResize"
    【解决方案5】:

    我在布局中遇到了类似的问题,其中包含滚动视图。 每当我尝试在 EditText 中选择文本时,复制/剪切/粘贴操作栏都会使用下面的代码向上移动,因此它不会调整布局大小

    android:windowSoftInputMode="adjustPan"
    

    修改如下

    1. AndroidManifest.xml

      android:windowSoftInputMode="stateVisible|adjustResize"

    2. style.xml 文件,活动风格

      是的

    它对我有用。

    【讨论】:

      【解决方案6】:

      在AndroidManifest.xml中,别忘了设置:

       android:windowSoftInputMode="adjustResize"
      

      对于 ScrollView 中的 RelativeLayout,设置:

       android:layout_gravity="center" or android:layout_gravity="bottom" 
      

      会好的

      【讨论】:

      • android:layout_gravity="center" 工作,谢谢! :) 现在 EditText 按我的意愿在键盘上移动
      【解决方案7】:

      for Activity 在它的 oncreate 方法中插入下面的行

      getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
      

      对于片段在其 onCreate 方法中

      getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
      

      【讨论】:

      • 它有效。谢谢! :)
      【解决方案8】:

      向上滚动屏幕需要执行 3 个步骤。

      1. 在清单文件中写入您的活动:

      android:windowSoftInputMode="adjustResize"

      1. 在活动的 oncreate() 方法中添加以下行

      getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE|WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

      1. 然后将整个视图放在 XML 文件中的“Scrollview”中,例如:
      <?xml version="1.0" encoding="utf-8"?>
      <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="fill_parent"
          android:background="@drawable/bg"
          android:layout_height="match_parent" 
          > 
          <RelativeLayout
               android:layout_width="fill_parent"
              android:layout_height="match_parent"
              android:layout_gravity="center" >
              <TextView />
               .........
              <TextView />
              <EditText >
                  <requestFocus />
              </EditText>
              <Button />
          </RelativeLayout>
       </ScrollView>
      

      附:不要忘记在父相对布局中添加 android:layout_gravity="center"。

      【讨论】:

        【解决方案9】:
        <activity name="ActivityName"
            android:windowSoftInputMode="adjustResize">
            ...
        </activity>
        

        在要滚动的布局周围添加 NestedScrollView,这将完美地工作

        【讨论】:

          【解决方案10】:

          我尝试了 Diego Ramírez 的一种方法,它很有效。 在 AndroidManifest 中:

              <activity
                  android:name=".MainActivity"
                  android:windowSoftInputMode="stateHidden|adjustResize">
                  ...
              </activity>
          

          在activity_main.xml中:

          <LinearLayout ...
              android:orientation="vertical">
          
          <Space
              android:layout_width="wrap_content"
              android:layout_height="0dp"
              android:layout_weight="1" />
          
          <EditText
              android:id="@+id/edName"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:ems="10"
              android:hint="@string/first_name"
              android:inputType="textPersonName" />
          
          <EditText ...>
          ...
          </LinearLayout>
          

          【讨论】:

            【解决方案11】:

            我找到了一个解决我的问题的方法,它和你的差不多。

            首先,我只有一个带有 2 个元素的 LinearLayout,一个 ImageView 和一个 LinearLayout,其中包含 2 个 EditText 和一个 Button,所以我需要在没有键盘的情况下将它们分开全屏,当键盘出现时它们应该看起来更近了。

            所以我在它们之间添加了高度属性为 0dp 和重量为 1 的视图,这让我可以将视图彼此分开。当键盘出现时,由于它们没有固定的高度,它们只是调整大小并保持外观。

            瞧!当键盘存在或不存在时,布局调整大小和视图之间的距离是相同的。

            【讨论】:

            • 为什么不发布代码,以便更好地理解?
            • 我在上面贴了一个示例代码:stackoverflow.com/a/31994697/2914140.
            • 您可以通过使用ConstraintLayout 并将顶部部分固定在顶部并将底部部分固定在底部,以一种不那么老套的方式来实现这一点。当键盘打开时,它会自然地通过挤压中间的空间来调整大小(如果你使用adjustResize
            【解决方案12】:
            1. 如果用户希望使用清单执行此任务,则在清单中添加此行
            2. 在清单中添加这一行: - android:windowSoftInputMode="adjustPan" 例如

            在 Java 文件或 Kotlin 文件中(以编程方式):- 如果用户想要使用 Activity,则在 onCreate 方法中添加以下行

            activity?.window()?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
            

            【讨论】:

            • 您好,欢迎来到 stackoverflow,感谢您的回答。您能否简单地解释一下您解决了什么问题以及您是如何解决的,而不是仅仅发布一段代码?这将有助于以后发现此问题的人更好地了解该问题以及如何处理它。
            【解决方案13】:

            这是完整的清单代码

            <activity
                    android:name=".activities.MainActivity"
                    android:windowSoftInputMode="adjustResize"
                    android:label="@string/app_name">
                    <intent-filter>
                        <action android:name="android.intent.action.MAIN" />
                        <category android:name="android.intent.category.LAUNCHER" />
                    </intent-filter>
                </activity>
            

            【讨论】:

              【解决方案14】:

              在您的清单文件中添加以下行。它会工作

              <activity name="MainActivity"
                  android:windowSoftInputMode="stateVisible|adjustResize">
                  ...
              </activity>
              

              【讨论】:

              • stateVisible 在我的情况下丢失了。
              【解决方案15】:

              我刚刚在顶层布局中添加了以下行,一切正常:

              android:fitsSystemWindows="true"
              

              【讨论】:

              • @yash786 可能是在edittext下方显示按钮接收焦点?第二个问题你能分享你的布局文件或回答我你是如何在键盘顶部添加edittext的吗?
              • 它适用于我没有 android:windowSoftInputMode="stateVisible|adjustResize" 的事件
              【解决方案16】:

              如果您处于片段中,那么您必须将以下代码添加到您的活动中的 onCreate 中,它可以为我解决问题

              getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
              

              【讨论】:

                【解决方案17】:

                在查看了很多解决方案后,这对我有用:

                AndroidManifest.xml 中,将以下行添加到项目清单文件中的活动声明中。

                android:windowSoftInputMode="stateHidden|adjustPan" 
                

                代码应如下所示:

                    <activity
                        android:name=".MainActivity"
                        android:screenOrientation="landscape"
                        android:windowSoftInputMode="stateHidden|adjustPan">
                    </activity>
                

                【讨论】:

                • 链接已损坏。
                • 很抱歉。刚刚编辑了答案,尝试使用这个版本(将“stateVisible”更改为“stateHidden”并添加了“adjustPan”)。以前的版本现在也不适合我。
                【解决方案18】:

                好吧,这已经很晚了,但是我发现如果您在编辑文本下添加一个列表视图,那么键盘将移动该编辑文本下的所有布局而不移动列表视图

                <EditText
                android:id="@+id/et"
                android:layout_height="match_parent"
                android:layout_width="match_parent"
                
                
                
                />
                
                <ListView
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"//can make as 1dp
                    android:layout_below="@+id/et" // set to below editext
                    android:id="@+id/view"
                    >
                **<any layout**
                

                这是唯一对我有用的解决方案。

                【讨论】:

                  【解决方案19】:

                  没有一条建议可以解决我的问题。 调整平移几乎与调整大小工作一样。如果我设置 Adjust Nothing 而不是布局不会向上移动,但它会隐藏我正在编写的底部的编辑文本。所以经过 24 小时的持续搜索,我找到了this source,它解决了我的问题。

                  【讨论】:

                    【解决方案20】:

                    可能有点晚了,但我想补充几点。 在 Android Studio 4.0.1 版和 Gradle 6.1.1 版中,如果您在 Activity 中添加以下标志,windowSoftInputMode 将无法正常工作:

                    getWindow().setFlags(
                                    WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
                                    WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
                            );
                    

                    在浪费了很多时间之后,我发现了那个 hack。为了使adjustResizeAdjustPanwindowSoftInputMode 的任何属性正常工作,您需要将其从您的活动中删除。

                    【讨论】:

                      【解决方案21】:

                      使用 Scroll View 作为 Parent 并在 Scroll View 中使用这个标签

                      android:fillViewport="true"

                      【讨论】:

                        【解决方案22】:

                        将这一行添加到视图中:

                        view.requestFocus();
                        

                        【讨论】:

                          猜你喜欢
                          • 2012-02-25
                          • 1970-01-01
                          • 2017-04-20
                          • 1970-01-01
                          • 2015-11-01
                          • 2011-04-16
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多