软键盘显示时如何保持背景图像大小

时间:2011-05-11 14:25:35

标签: android background android-layout

当软件键盘显示时,它会调整我的布局大小,从而将背景图像压缩在一起。我的问题基本上是这个问题的重复,这个问题以非常好的方式解释:

Software keyboard resizes background image on Android

然而,当他们找到解决问题的黑客时,这个问题就被关闭了。我不能用这个黑客。我的整个布局都在ScrollView中,我需要能够始终正确使用此scrollview。通过使用android:windowSoftInputMode =“stateVisible | adjustPan”,用户将无法向下滚动并在键盘显示时看到屏幕底部,因为布局将部分存在于键盘后面。因此,解决方案对我来说是不可接受的。那里有更好的解决方案吗?

干杯,

9 个答案:

答案 0 :(得分:31)

我实际上不久前遇到过类似的问题。不过,我偶然发现了正确的答案。

在此项目的Android清单中,附加到您正在使用的特定活动,请使用活动代码中的行android:windowSoftInputMode="adjustPan|stateVisible"

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

来源: Android Dev for Activity tags

答案 1 :(得分:27)

经过几天的硬核黑客攻击后,我终于设法构建了一个解决方案,所以它可能会让读者感到非常伤心。我将一个带有背景的ImageView放在scrollview后面,并设置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>

答案 2 :(得分:21)

您可以使用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"/>

答案 3 :(得分:8)

当我遇到这个问题时,我正在谷歌上搜索解决这个确切问题的方法,经过一些研究后我发现了一个解决方案,我觉得稍微好一些。您可以在活动中使用此功能,而不是使用ImageView进行攻击:

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

希望它可以帮助其他人寻找解决方案。

答案 4 :(得分:7)

我不能对你的答案发表评论,但我想补充一些内容。

我理解您的困境以及为什么您链接的解决方案不是您的情况的完整解决方案(因为您无法滚动到视图的底部)。我有一个类似的情况与一个大的可滚动EditText框。当弹出软键盘时,我不喜欢背景被压扁。

我已经尝试过您的解决方案,虽然乍一看似乎有效,但在某些情况下它可能并不理想:

  1. 如果您允许应用使用横向模式,则背景将不会调整大小/拉伸
  2. 如果您在屏幕或dpi较大的设备上运行应用,则背景可能无法填满屏幕
  3. 基本上,当您将scaleType设置为matrix时,您似乎告诉Android以1:1绘制背景而不是缩放。因此,当您使用解决方案打开软键盘时发生的情况是,scrollViewimageView都像往常一样调整大小,但您设置的图像src仍然是1:1,因此继续显示相同的区域。

    因此,例如,如果您的背景图像设置为特定尺寸(例如480 x 800)并且它完美地填充了您的Nexus One,那么当您旋转到横向时,您将在右侧有一个黑色区域。

    当然,如果你的背景只是一个重复的模式,这是没有实际意义的,在这种情况下,你可以使它非常大,并希望补偿各种屏幕(甚至是平板电脑)。

    或者您也可以为不同的屏幕尺寸/密度/方向提供不同的背景,但这仍然不考虑缩放。

    徒劳地试图解决这个问题,我偶然发现了一个名为android:isScrollContainerView属性。此属性告诉某些视图是否允许它们在显示软键盘时调整大小。您的链接解决方案中的某人也提到了这一点。我已经尝试在包含我的背景的ViewGroup上设置此(为假),但滚动的任何子元素都会覆盖它,导致再次压扁。

    截至目前,我认为我们的情况并不完整。你肯定在某些情况下工作,我感谢你的努力。希望Google将来会提供解决方案,但我认为他们不会认为这是一个问题/优先事项。

答案 5 :(得分: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文件中设置任何背景!

这是我的第一篇文章,我希望它对我的英语有帮助和抱歉。

答案 6 :(得分:6)

在Androidmanifest中的

活动标签使用:

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

检查Android Developer reference

答案 7 :(得分:1)

'背景'是布局的解决方案怎么样?我们可以膨胀布局,使其成为整个窗口大小,然后将其作为窗口背景插入吗?

答案 8 :(得分:0)

经过大量的时间搜索......

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