【问题标题】:How to keep background image size when software keyboard show软件键盘显示时如何保持背景图像大小
【发布时间】:2011-08-23 09:04:39
【问题描述】:

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

Software keyboard resizes background image on Android

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

干杯,

【问题讨论】:

    标签: android background android-layout


    【解决方案1】:

    也许还有另一个(非常简单!)解决方案: 在样式.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 文件中设置任何背景!

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

    【讨论】:

    • 所以,你的第一篇文章很有帮助。
    【解决方案2】:

    经过大量时间搜索...

    在每个活动中输入android:windowSoftInputMode="adjustPan|stateVisible"

    【讨论】:

    • 如果你有edittext底部填充,adjustpan删除这个填充
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

        您可以使用 windowBackground 属性,使可绘制对象适合整个屏幕。 为此,您需要:

        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"/>
        

        【讨论】:

        • 看起来是最好的解决方案,谢谢。它对我来说很好。
        • 这个真的对我有用,没有任何副作用。谢谢!
        • 经过一天的搜索,我应用了您的解决方案,并且效果很好。一点注意事项:将 parent="@android:style/Theme.NoTitleBar" 更改为 "AppTheme" 或在您的 styles.xml 文件中编写的另一个。在其他情况下会发生异常。
        • 对不起,我的无知,但是,我把这个背景图片放在哪里,或者我如何链接它,我正在使用cordova,我不确定如果你开发本地,这是否是一个微不足道的情况。
        【解决方案6】:

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

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

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

        来源: Android Dev for Activity tags

        【讨论】:

        • 这并不能解决 OP 的问题。他特别提到这个解决方案不适用于他的案例,因为他需要scrollview 可见/可达的底部。想象一下,试图键入一条长消息,但在几行之后却看不到您正在键入的内容。使用此解决方案,因为活动不会自行调整大小,您将丢失最后几行,因为它们隐藏在键盘后面。
        【解决方案7】:

        在Androidmanifest中activity标签使用:

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

        检查Android Developer reference

        【讨论】:

          【解决方案8】:

          我无法评论你的回答,但我想补充一点。

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

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

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

          基本上,当您将 scaleType 设置为 matrix 时,您似乎是在告诉 Android 以 1:1 绘制背景而不是按比例绘制。因此,当您使用您的解决方案打开软键盘时,您的 scrollViewimageView 都会像往常一样调整大小,但您设置的图像 src 仍然是 1:1,因此继续显示相同的区域。

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

          当然,如果您的背景只是一个重复的图案,那么这是没有实际意义的,在这种情况下,您可以将其设置得非常大,并有望补偿各种屏幕(甚至是平板电脑)。

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

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

          到目前为止,我认为我们的情况还没有完整的解决方案。你的在某些情况下肯定有效,我感谢你的努力。希望 Google 将来会提供解决方案,但我认为他们不会将此视为问题/优先事项。

          【讨论】:

            【解决方案9】:

            经过几天的硬核黑客攻击,我终于设法构建了一个如此先进的解决方案,阅读它实际上可能会受到伤害。我在滚动视图后面放置一个带有背景的 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>
            

            【讨论】:

            • 我们不能将矩阵作为缩放类型,它会影响图像缩放属性,而在我的情况下我需要 fitCenter。
            猜你喜欢
            • 2011-07-15
            • 2011-05-16
            • 2015-11-01
            • 2015-07-05
            • 2018-04-29
            • 2011-04-16
            • 2015-06-18
            • 2017-02-25
            • 2019-11-17
            相关资源
            最近更新 更多