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

pgs*_*rom 22 android background android-layout

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

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

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

干杯,

syk*_*lon 31

我不久前遇到过类似的问题.不过,我偶然发现了一些正确的答案.

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

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

来源: Android Dev for Activity标签

  • 这并不能解决OP的问题.他特别提到这个解决方案对他的情况不起作用,因为他需要他的`scrollview`的底部可见/可达.想象一下,尝试输入一条长信息而不能在几行后看到你正在输入的内容.使用此解决方案,因为活动不会自行调整大小,您将丢失最后几行,因为它们隐藏在键盘后面. (8认同)

pgs*_*rom 28

经过几天的硬核黑客攻击后,我终于设法构建了一个解决方案,所以它可能会让读者感到非常伤心.我将一个带有背景的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>
Run Code Online (Sandbox Code Playgroud)


agl*_*our 22

您可以使用windowBackground属性,这使得drawable适合整个屏幕.要做到这一点,你需要:

1-创建样式:

<style name="Background" parent="@android:style/Theme.NoTitleBar">
    <item name="android:windowBackground">@drawable/you_bg_drawable</item>
</style>
Run Code Online (Sandbox Code Playgroud)

2-在AndroidManifest.xml中设置您的活动样式

<activity
    android:name=".ui.your_activity"
    android:theme="@style/Background"/>
Run Code Online (Sandbox Code Playgroud)

  • 看起来是最好的解决方案,谢谢.它对我很有用. (2认同)

Joh*_*sen 8

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

      getWindow().setBackgroundDrawableResource(R.drawable.bg_my_background);
Run Code Online (Sandbox Code Playgroud)

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


Ton*_*han 7

我不能评论你的答案,但我想补充一些东西.

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

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

  1. 如果您允许应用程序采用横向模式,则背景将不会调整大小/拉伸
  2. 如果您在具有较大屏幕或dpi的设备上运行应用程序,则背景可能无法填满屏幕

基本上似乎当你设置scaleTypematrix你告诉Android以1:1绘制背景而不是缩放.所以当您使用解决方案打开软键盘时发生的情况是,您scrollViewimageView所有人都像往常一样调整大小,但您设置的图像src仍然是1:1因此继续显示相同的区域.

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

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

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

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

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


小智 7

也许还有另一个(非常简单!)解决方案:在styles.xml中:创建一个这样的新样式:

<style name="Yourstyle" parent="AppBaseTheme">
    <item name="android:windowBackground">@drawable/mybackground</item>
</style>
Run Code Online (Sandbox Code Playgroud)

AppBaseTheme是您常用的应用主题.然后添加Manifest.xml:

<activity 
    android:name="com.your.app.name.Activity"
    android:theme="@style/Yourstyle">
</activity>
Run Code Online (Sandbox Code Playgroud)

所以你有相同的风格,但有背景.

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

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


小智 6

在Androidmanifest中的活动标签使用:

<activity ... android:windowSoftInputMode="adjustPan" ></activity>
Run Code Online (Sandbox Code Playgroud)

检查Android Developer参考