为什么在Android中设置android:windowSoftInputMode="stateVisible|adjustResize"时软键盘弹出后屏幕没有自适应调整?

5
我似乎无法使android:windowSoftInputMode="stateVisible|adjustResize"选项起作用。当软键盘出现时,滚动视图不会自动向下滚动到底部。
编辑:我尝试使用adjustPan代替(stateVisible | adjustPan),但是滚动视图被禁用了。
解决方案:最终,我找到了一个有效的建议。我创建了一个OnGlobalLayoutListener()并将其添加到我的滚动视图中。我检查了我的活动的根视图(即我的滚动视图)的高度是否改变。如果是,我假设软键盘已显示。
点击这里获取更多信息。
以下是我的源代码:

AndroidManifest.xml

<application
        ...
        android:theme="@android:style/Theme.NoTitleBar" >
        <activity
            ...
            android:screenOrientation="portrait"
            android:windowSoftInputMode="stateVisible|adjustResize" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        ...
</application>

登录界面带键盘 - 滚动视图无法滚动 enter image description here 期望的结果 enter image description here

请使用 android:windowSoftInputMode="adjustPan|adjustResize"。 - Piyush
类似于adjustPan|stateVisible,这会禁用滚动视图。 - Jerome Christopher Geronimo
关于你的解决方案,我想知道你是如何在键盘可见的情况下解决的。虽然这个代码对我起作用了。 loginScrollView.post(() -> loginScrollView.fullScroll(ScrollView.FOCUS_DOWN)); - 6rchid
5个回答

4
解决方案:最终,我发现了一个有效的建议。 我创建了一个OnGlobalLayoutListener()并将其添加到我的滚动视图中。 我检查了我的活动的根视图(即我的滚动视图)的高度是否改变。 如果是,则假定软键盘已显示。

更多信息请点击此处


0

尝试

android:windowSoftInputMode="adjustPan|stateVisible"

1
抱歉,我忘了提到我已经尝试过那个了。如果使用adjustPan,滚动视图将不再滚动。 - Jerome Christopher Geronimo
我该如何在Xcode中实现这个?有没有相应的选项可以做到同样的事情? - exequielc

0

你可以通过在你的Activity中重写onConfigurationChanged()回调函数,自动滚动到活动的底部:

scrollView.post(new Runnable() {            
    @Override
    public void run() {
           scrollView.fullScroll(View.FOCUS_DOWN);              
    }
});

这意味着您还需要在AndroidManifest文件中的活动声明中使用configChanges属性,告诉您的活动您希望在活动更改其布局时调用回调函数:
<activity
    android:configChanges="screenLayout|screenSize" <!-- Don't know which could actually do the trick -->
    ... >
</activity>

我希望这能帮到你。


我添加了onConfigurationChanged(),但它没有被调用。即使在AndroidManifest.xml中添加了configChanges参数。 - Jerome Christopher Geronimo
你怎么知道它没有被调用?你尝试在logcat中打印一条消息来查看了吗? - Mickäel A.
嗨。是的。我在方法内添加了一个Log.i()调用。无论如何,我终于找到了一个可行的解决方案。我会编辑我的帖子并包含它。谢谢! - Jerome Christopher Geronimo

0

在清单文件中:

android:windowSoftInputMode="adjustPan|stateVisible"

在布局XML中,滚动视图的所有子布局底部设置一个文本视图,例如:
  <ScrollView
    android:id="@+id/driverLoginScrollView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:fillViewport="false"
    android:scrollbars="none">
     <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:layout_marginTop="50dp"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:orientation="vertical">
        .
        .
        .
       <TextView
       android:layout_width="match_parent"
       android:layout_height="100dp"
       android:focusable="false"
       android:textIsSelectable="false" />
       </LinearLayout>
</ScrollView>

-2
我发现如果在我的滚动视图上设置了布局参数,那么它就不能正常工作。只要我移除了布局参数,它就按预期工作了。我无法解释为什么,只是让其他人知道这对我有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接