如何在软件键盘弹出时保持背景图片的大小

24

当软键盘显示时,它会重新调整我的布局,从而将背景图像挤在一起。我的问题基本上是这个问题的重复,该问题被很好地解释:

Android上软键盘调整背景图像大小

然而,当他们找到一个解决方案时,那个问题已经关闭了。我不能使用这个解决方案。我的整个布局都在ScrollView中,我需要能够在任何时候正确地使用这个ScrollView。通过使用android:windowSoftInputMode="stateVisible|adjustPan",用户将无法向下滚动并查看屏幕底部,因为布局将部分存在于键盘后面。因此,这个解决方案对我来说是不可接受的。是否有更好的解决方案?

谢谢,

9个回答

32

我不久前也遇到了类似的问题,但稍加努力后找到了正确的答案。

在此项目中的Android清单文件中,针对你正在使用的特定活动,在活动标记中使用android:windowSoftInputMode="adjustPan|stateVisible"

adjustPan基本上意味着你的活动不会调整自身大小以适应软键盘,而stateVisible则表示软键盘将在请求时显示(如果需要可以是stateAlwaysVisible等)。

来源: Android Dev for Activity tags


8
这并没有解决原帖作者的问题。他明确提到这种解决方案对他的情况无效,因为他需要滚动视图的底部可见/可到达。想象一下,在不能看到几行后你尝试打一个长消息。由于活动不会自动调整大小,使用此解决方案将导致最后几行被键盘遮挡而无法看到。 - Tony Chan

28

经过数天的超强编程,我终于成功地构建出了一种解决方案,它是如此先进以至于阅读起来可能会让人感到疼痛。我在ScrollView后面放置了一个带有背景的ImageView,并设置了scaleType="matrix",这样当键盘弹出时,它不会缩小。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@color/black"
    >
    <ImageView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:src="@drawable/mah_kewl_background"
        android:scaleType="matrix"
        />
    <ScrollView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:fillViewport="true"
        >
        <RelativeLayout
            android:id="@+id/smsLayout"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            >
            <TextView
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:text="PLUNX"
                />
        </RelativeLayout>
    </ScrollView>
</RelativeLayout>

1
我们不能将矩阵作为比例类型,因为它会影响图像缩放属性,而在我的情况下,我需要fitCenter。 - Ready Android

23
您可以使用windowBackground属性,使drawable适应整个屏幕。要实现这一点,您需要:
1- 创建样式:
<style name="Background" parent="@android:style/Theme.NoTitleBar">
    <item name="android:windowBackground">@drawable/you_bg_drawable</item>
</style>

2- 在AndroidManifest.xml文件中设置你的活动样式。

<activity
    android:name=".ui.your_activity"
    android:theme="@style/Background"/>

2
看起来是最好的解决方案,谢谢。它对我很有效。 - ernazm
这个对我真的很有效,没有任何副作用。谢谢! - myforums
经过一天的搜索,我尝试了您的解决方案,它很好用。需要注意的是:将parent="@android:style/Theme.NoTitleBar"更改为“AppTheme”或其他在styles.xml文件中编写的主题名称。否则会出现异常。 - CoolMind
抱歉我的无知,但是我把这个背景图片放在哪里了,或者如何链接它,我正在使用Cordova,如果您开发本地应用程序,我不确定这是否是一个微不足道的情况。 - Luiz Rossi

8

当我谷歌搜索解决这个确切问题时,我遇到了这篇文章,在做了一些研究后,我找到了一个我认为比较好的解决方法。不要使用 ImageView 进行修改,而是在您的活动中使用以下代码:

      getWindow().setBackgroundDrawableResource(R.drawable.bg_my_background);

希望这篇文章能帮助其他搜索此问题解决方法的人。

7
我无法评论您的答案,但我想补充一些内容。
我了解你的困境以及为什么你链接的解决方案不是你情况下完整的解决方案(因为你无法滚动到视图底部)。我有一个类似的情况,即具有大型可滚动EditText框的情况。当软键盘弹出时,我不喜欢我的背景被挤压。
我尝试过你的解决方案,虽然乍一看似乎有效,但在某些情况下可能不是理想的:
1.如果您允许应用程序使用横向模式,则背景将不会调整/拉伸。 2.如果您在具有较大屏幕或dpi的设备上运行应用程序,则您的背景可能无法填充屏幕。
基本上,当你将'scaleType'设置为'matrix'时,你告诉Android以1:1的比例绘制背景而不进行缩放。所以当你使用你的解决方案打开软键盘时,你的'scrollView'和'imageView'都像往常一样被重新调整大小,但你设置的图像源保持1:1,因此继续显示相同的区域。
所以,例如,如果您的背景图像设置为特定大小(例如480 x 800),并且它完美地填充了您的Nexus One,那么当您旋转到横向时,右侧将会有一个黑色区域。
当然,如果您的背景仅是重复的图案,则无关紧要,在这种情况下,您可以使其非常大,并希望弥补各种屏幕(甚至可能是平板电脑)。
或者,您还可以为不同的屏幕大小/密度/方向提供不同的背景,但这仍然不能解决缩放问题。
在试图解决这个问题的徒劳努力中,我偶然发现了一个名为android:isScrollContainerView属性。此属性告诉某些视图是否允许在显示软键盘时调整大小。这也被您链接的解决方案中的某人提到。我尝试在包含我的背景的ViewGroup上设置它(为false),但任何滚动的子元素似乎都会覆盖它,导致再次挤压。

就目前而言,我认为我们的情况还没有完整的解决方案。你的方法在某些情况下确实有效,我感谢你的努力。希望谷歌未来能提供一个解决方案,但我不认为他们会把这视为一个问题/优先事项。


7
也许还有另外一个(非常简单的!)解决方案: 在styles.xml中: 创建一个新的样式,如下所示:
<style name="Yourstyle" parent="AppBaseTheme">
    <item name="android:windowBackground">@drawable/mybackground</item>
</style>

AppBaseTheme是应用程序中通常使用的主题。 然后在Manifest.xml中添加:

<activity 
    android:name="com.your.app.name.Activity"
    android:theme="@style/Yourstyle">
</activity>

所以您有相同的样式,但带有背景。

重要提示:不要在您的普通 .xml 文件中设置任何背景!

这是我的第一篇帖子,希望能对您有所帮助,对我的英语表示抱歉。


1
所以,你的第一篇帖子非常有用。 - CoolMind

6

在 AndroidManifest 中的 activity 标签中使用:

<activity ... android:windowSoftInputMode="adjustPan" ></activity>

请查看Android开发者参考文档,了解更多有关活动元素的信息。


1
如何使用布局作为“背景”来解决问题?我们可以填充一个布局,使其与整个窗口大小相同,然后将其插入为窗口背景吗?

0

经过长时间的搜索...

在每个Activity中放置android:windowSoftInputMode="adjustPan|stateVisible"


如果您的EditText底部有填充,则需要使用adjustpan来移除此填充。 - famfamfam

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