【问题标题】:Space between keyboard and EditText in AndroidAndroid中键盘和EditText之间的空间
【发布时间】:2013-07-11 21:45:21
【问题描述】:

软输入模式是"SOFT_INPUT_ADJUST_PAN",当显示键盘时,EditText 向上移动以保持可见,但键盘和 txt 的底部总是粘在一起,如截图所示,我想要它们之间的空间,可以吗?

输入模式也必须保持为"SOFT_INPUT_ADJUST_PAN"

对不起,我的英语,在此先感谢...

【问题讨论】:

  • 为什么要坚持使用“adjustPan”?使用“adjustResize”不会有这个问题。
  • 因为使用“adjustResize”时,最大的问题是底部导航栏移动到键盘顶部。

标签: java android keyboard


【解决方案1】:

希望对您有所帮助:

如果您的代码中有此行,则将其删除:

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

或:

您不应该将layout_widthlayout_heights 设置为明确的像素值。相反,请酌情使用wrap_parentfill_parent

或:

如果您已将minSdkVersion 设置为3,则将其更改为minSdkVersion=4

编辑:

将 Activity 上的 android:windowSoftInputMode 设置为 "adjustPan"

或:

将此代码添加到您的setOnTouchListener()EditText 的主要活动中:

this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_UNSPECIFIED);

【讨论】:

  • 谢谢,输入模式必须保持 SOFT_INPUT_ADJUST_PAN。当显示键盘时,它会粘在edittexts(例如屏幕底部的edittext)。没关系,但我想在edittext和键盘之间留一些空间。
  • 欢迎好友.. 到目前为止我所做的建议您.. 并在 xml 的 EditText 中添加 marginBottom Attribute 后尝试,如果这些建议中的任何一个对您有用,请勾选此答案。 .
  • @altosh: 兄弟,如果我的回答对你有帮助,请勾选它,以便其他人知道这是正确的答案...
【解决方案2】:

我应用了上述对我有用的方法是 将 Activity 上的 android:windowSoftInputMode 设置为“adjustPan” 比我将填充添加到带有重力底部的edittext 它就像魅力一样。 谢谢,

【讨论】:

  • 填充是有效的,因为与边距不同,窗口管理器将其视为视图的内部。例如:editText.setPadding(0, 0, 0, 40) 将导致您的视图在键盘出现时在其下方额外获得 40px 的空间。我不必为此设置重力。
  • 如果这样做,edittext 中的文本会发生什么情况?
  • @user1232726 如果您将编辑文本的高度设置为 wrap_content,那么您的文本将出现偏离中心但全部可见。不同的故事,例如,您将编辑文本高度设置为 41dp 并将 paddingBottom 设置为 40dp
  • 当我添加填充时,它也会将 EditText 下的行向下推,从而弄乱了设计。因此,我认为这不是最好的解决方案
【解决方案3】:

你为什么不试试这个?

android:windowSoftInputMode="adjustResize"

我知道您想调整平移,但这也可以解决您的问题。

既然你真的很想继续使用adjustPan,也许你可以尝试重新设计一下XML布局。

您还必须将所需的填充添加到布局文件中最外层的容器元素中。

【讨论】:

  • edittext 和软键盘之间没有空格。想不通
  • @filthy_wizard 检查布局中的填充
  • 我怀疑这对我有用,但我使用的是底部导航,而这个是键盘,所以空间很大,你可以看到并按下任何导航按钮
【解决方案4】:

编辑文本中的简单填充不起作用。

使用 drawable 与您的编辑文本如下:

<?xml version="1.0" encoding="utf-8"?>

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:bottom="8dp"
        android:left="8dp"
        android:right="8dp"
        android:top="8dp">

        <shape android:shape="rectangle">

            <corners android:radius="10dp" />
            <stroke
                android:width="1dp"
                android:color="@color/white" />
            <solid android:color="@color/transparent" />
        </shape>
    </item>
</layer-list>

然后使用

    android:windowSoftInputMode="adjustPan"

在您的清单文件中。

【讨论】:

    【解决方案5】:

    只是想知道,您的应用是全屏的吗?有状态栏吗?如果是尝试禁用全屏模式并尝试查看是否可以解决您的问题。我记得前段时间有一个关于这个的错误。

    【讨论】:

      【解决方案6】:

      尝试useGlobalLayoutListener:

      private var focusView:View?=null

      // Register global layout listener.
          decorView?.viewTreeObserver?.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
      
              private val windowVisibleDisplayFrame = Rect()
              private var lastVisibleDecorViewHeight: Int = 0
      
              override fun onGlobalLayout() {
      
                  // Retrieve visible rectangle inside window.
                  decorView.getWindowVisibleDisplayFrame(windowVisibleDisplayFrame)
                  val visibleDecorViewHeight = windowVisibleDisplayFrame.height()
      
                  // Decide whether keyboard is visible from changing decor view height.
                  if (lastVisibleDecorViewHeight != 0) {
                      if (lastVisibleDecorViewHeight > visibleDecorViewHeight + MIN_KEYBOARD_HEIGHT_PX) {
                          // Calculate current keyboard height (this includes also navigation bar height when in fullscreen mode).
                          val currentKeyboardHeight = decorView.height - windowVisibleDisplayFrame.bottom
      
              //keyboardHeight = currentKeyboardHeight
      
      
                focusView =  activity?.currentFocus     
                focusView.setPadding(0, 0, 0, SET_BOTTOM_PADDING_SPACE)  // <---set space here
      
      
      
                      } else if (lastVisibleDecorViewHeight + MIN_KEYBOARD_HEIGHT_PX < visibleDecorViewHeight) {
      
                          focusView.setPadding(0, 0, 0, 0)
      
                      }
                  }
                  // Save current decor view height for the next call.
                  lastVisibleDecorViewHeight = visibleDecorViewHeight
              }
          })
      

      【讨论】: