Android 软键盘覆盖 EditText 字段

Android soft keyboard covers EditText field

提问人:Alexis 提问时间:7/21/2010 最后编辑:0xCursorAlexis 更新时间:1/11/2021 访问量:198656

问:

有没有办法让屏幕滚动以允许看到文本字段?

Android-EditText 软键

评论


答:

4赞 Luis Miguel Serrano 7/21/2010 #1

我相信你可以通过使用轨迹球让它滚动,这最终可以通过选择方法以编程方式实现,但这只是一个想法。我知道轨迹球方法通常有效,但至于执行此操作并使其从代码中工作的确切方法,我不确定。
希望能有所帮助。

评论

0赞 Alexis 7/21/2010
我认为我需要的是一种方法来“人为地”使窗口更长,以便视图可以滚动。目前 RelativeLayout 设置为 android:layout_width=“wrap_content” android:layout_height=“wrap_content”
0赞 Luis Miguel Serrano 7/21/2010
我不知道有什么解决方案。也许您可能希望手动调整宽度和高度值以满足您的需要,方法是将它们进一步拉伸到“wrap_content”解析到的值。
169赞 Cheryl Simon 7/21/2010 #2

您是否在问如何控制软键盘打开时可见的内容?您可能希望使用 windowSoftInputMode。有关更多讨论,请参阅开发人员文档

评论

2赞 Dmitry Chistyakov 1/28/2013
这很好用,但请确保您的对话框样式中有 <item name=“android:windowIsFloating”>true</item>,以防您使用的是自定义对话框样式。
0赞 Sampo Sarrala - codidact.org 4/16/2014
这似乎在横向模式(Nexus 7)下不起作用,可编辑元素隐藏在键盘下。我尝试了windowSoftInputMode的不同组合。似乎我无法设置 windowIsFloating,因为 ActionBar 不支持它。或者它可能也与我的 EditText 在列表视图项中的事实有关?
0赞 Max 10/6/2015
在我的它们中添加 <item name=“android:windowTranslucentStatus”>true</item> 后,这将不起作用。有人解决这个问题吗?
2赞 David Passmore 11/25/2015
@Max 添加到根视图以解决此问题。android:fitsSystemWindows="true"
1赞 Karue Benson Karue 7/30/2016
当软键盘可用时,无论像 whatsapp 一样,将整个布局拉到键盘上方怎么样......
26赞 zmilojko 8/19/2010 #3

为什么不尝试添加一个 ScrollView 来包装您想要滚动的任何内容。这是我是如何做到的,我实际上在顶部留下了一个不滚动的标题,而对话框小部件(特别是 EditTexts)在您打开软键盘时会滚动。

<LinearLayout android:id="@+id/HeaderLayout" >
  <!-- Here add a header or whatever will not be scrolled. -->
</LinearLayout>
<ScrollView android:id="@+id/MainForm" >
  <!-- Here add your edittexts or whatever will scroll. -->
</ScrollView>

我通常会在 ScrollView 中有一个 LinearLayout,但这取决于您。此外,将 Scrollbar 样式设置为 outsideInset 会有所帮助,至少在我的设备上是这样。

评论

4赞 SMBiggs 12/4/2012
虽然 Mayra 的回答是每个人都应该做的(也可能是 Google 认为每个人都应该做的),但这是我几乎每次都会做的事情。这是获得使显示正确所需的真正控制的唯一方法。叹息。
0赞 Darpan 6/19/2015
不要低估斯科特的评论。这是真的。就我而言,我不想调整列表视图的大小或平移我的列表视图,而是想占用该列表末尾的 editText。因此,我已将editText放在scrollView中,它按预期工作。
58赞 DanKodi 6/25/2013 #4

我遇到了同样的问题,软键盘位于位于屏幕底部的 EditText 视图的顶部。我能够通过在我的AndroidManifest.xml文件的相关活动中添加一行来找到解决方案。

android:windowSoftInputMode="adjustResize|stateHidden"

整个活动标记如下所示:

<activity
        android:name="com.my.MainActivity"
        android:screenOrientation="portrait"
        android:label="@string/title_activity_main"
        android:windowSoftInputMode="adjustResize|stateHidden" >
    </activity>

这里最重要的值是 adjustResize。这将向上移动整个 UI,以便为软键盘留出空间。

评论

0赞 Rahul Dole 6/14/2014
但是,如果您的 css 主要具有百分比值,这可能会弄乱您的 html 外观
0赞 DanKodi 6/16/2014
你是在这里猜测还是尝试过?顺便说一句,它不应该搞砸你的 HTML。我试过使用网络视图。它将改变整个视图,而不是单个元素。
1赞 Rahul Dole 6/16/2014
我试过了。我认为发生这种情况是因为我的 css 主要具有百分比值
0赞 IgorGanapolsky 7/10/2015
@DanKodi我试过了,它与.adjustResize|stateHiddenadjustPan
178赞 Kuldeep Sakhiya 2/15/2014 #5

我有同样的问题。请尝试以下代码:

android:windowSoftInputMode="adjustPan"

将其添加到保存输入的活动的活动标记中的 manifest.xml 中。例:

<activity
            android:name=".Activities.InputsActivity"
            ...
            android:windowSoftInputMode="adjustPan"
            />

评论

14赞 Navid Rezaei 5/27/2014
最简单的答案!请注意,这需要添加到 Manifest 文件和我们想要的活动下。
6赞 Rahul Dole 6/14/2014
就我而言,这至少不会像那样弄乱我的html,但它也涵盖了我的输入字段adjustResize
1赞 Kuldeep Sakhiya 10/14/2015
@vikifor,请确保将 edittext 添加到 scrollview 中。即使布局中只有 3-4 个字段,也可以将所有字段添加到滚动视图中。这使得它在虚拟键盘打开时可滚动。
0赞 Iqbal 2/15/2016
工作正常,但每当我触摸 EditText 视图时,键盘都会重新绘制。
0赞 Konstantin Konopko 5/19/2016
这对我不起作用,直到您按任意键,然后显示文本字段。Scrollview 或 LinearLayout 作为根视图 — 无关紧要。
15赞 William Moffitt 6/7/2014 #6

很抱歉恢复了旧线程,但没有人提到您的 EditText 元素中的设置android:imeOptions="flagNoFullscreen"

17赞 Ekundayo Blessing Funminiyi 2/2/2016 #7

您需要做的就是

android:isScrollContainer="true"

来源: http://www.davidwparker.com/2011/08/25/android-fixing-window-resize-and-scrolling/

评论

1赞 johndodo 8/31/2016
虽然答案本身对我没有多大帮助(不需要属性),但链接的源包含完整的解释(表单应嵌入 ScrollView 中)。谢谢!
0赞 steven smith 12/26/2017
同样,页面上没有任何帮助,但链接显示将 adjustResize 添加到活动 windosSoftInputMode 并且有效。
8赞 LF00 12/7/2016 #8
android:windowSoftInputMode="adjustPan"
android:isScrollContainer="true"

适用于 android EditText,而不适用于 webview 或 xwalkview。当软键盘隐藏您使用的 webview 或 xwalkview 中的输入时android:windowSoftInputMode="adjustResize"

1赞 umesh shakya 5/25/2018 #9

将此单行添加到您的相关活动中,其中 Key Board Cover 编辑 text.inside onCreat()活动方法。

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
-1赞 Ahamed Riswan 7/9/2018 #10

编辑你的 AndroidManifest.xml

android:windowSoftInputMode="adjustResize"

将其添加到布局文件的根视图中。

android:fitsSystemWindows="true"

就这样。

0赞 Beast77 4/19/2019 #11

我知道这是旧的,但上述解决方案都不适合我。经过广泛的调试,我发现了问题所在。 解决方案是在我的样式.xml中将属性设置为falseandroid:windowTranslucentStatus

0赞 sameer 1/21/2020 #12

如果 KeyBoard 覆盖了 EditText 字段,请使用以下代码:

    EditText= findViewById(R.id.edittext)
    EditText?.getParent()?.requestChildFocus(EditText,EditText)

如果您希望光标位于 Focused EditText 中,请在 之后使用,这有助于在 Focused EditText 中获取焦点和光标。EditText.requestFocus()EditText?.getParent()?.requestChildFocus(EditText,EditText)

-1赞 Alessandro Pace 7/30/2020 #13

我遇到了同样的问题,搜索了说要添加的人,而在我的情况下有效。adjustPanadjustResize

<activity
    android:name=".YOUR.ACTIVITY"
    ...
    android:windowSoftInputMode="adjustResize"
/>

评论

0赞 Alessandro Pace 9/13/2021
如果发生在我身上,也可能发生在其他人身上,只是想帮助;) @BabyishTank
1赞 harpreet makkar 9/8/2020 #14

只需添加

android:gravity="bottom" android:paddingBottom="10dp"

根据编辑文本的大小更改 paddingBottom

0赞 Akshay Ashok 9/30/2020 #15

上述解决方案完美运行,但如果您使用的是全屏活动(半透明状态栏),则这些解决方案可能不起作用。 因此,对于全屏,请在 Activity 的 onCreate 函数中使用此代码。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        Window w = getWindow();
        w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN , WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN );
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.TYPE_STATUS_BAR);
    }

例:

  protected void onCreate(Bundle savedInstanceState) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        Window w = getWindow();
        w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN , WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN );
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.TYPE_STATUS_BAR);
    }
    
    super.onCreate(savedInstanceState);