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

无论何时出现软件键盘,都会调整背景图像的大小。 请参阅下面的截图:

正如你所看到的,背景被挤压了。 任何人都可以了解为什么背景调整?

我的布局如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/page_bg" android:isScrollContainer="false" > <LinearLayout android:layout_height="wrap_content" android:orientation="horizontal" android:layout_width="fill_parent" > <EditText android:id="@+id/CatName" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:inputType="textCapSentences" android:lines="1" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/save" android:onClick="saveCat" /> </LinearLayout> <ImageButton android:id="@+id/add_totalk" android:layout_height="wrap_content" android:layout_width="wrap_content" android:background="@null" android:src="@drawable/add_small" android:scaleType="center" android:onClick="createToTalk" android:layout_marginTop="5dp" /> </LinearLayout> 

好吧,我通过使用固定它

 android:windowSoftInputMode="stateVisible|adjustPan" 

manifest文件中<Activity >标签内的条目。 我认为这是由在活动中有ScrollView引起的。

在开发一个聊天应用程序,与背景图像聊天屏幕时,我面临同样的问题。 android:windowSoftInputMode="adjustResize"在显示软键盘后挤压我的背景图像以适应可用空间,并且“adjustPan”向上移动整个布局以调整软键盘。 解决此问题的方法是在活动XML中设置窗口背景而不是布局背景。 在您的活动中使用getWindow().setBackgroundDrawable()

通过android:windowSoftInputMode =“adjustPan”给用户带来不好的体验,因为通过整个屏幕顶部(转移到顶部)所以,下面是最好的答案之一。

我有同样的问题,但在那之后,我从@Gemfind了真棒回答

在清单

 android:windowSoftInputMode="adjustResize|stateAlwaysHidden" 

在xml中

不要在这里设置任何背景,并保持您的视图在ScrollView下

在Java中

您需要将背景设置为窗口:

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

感谢@Gem。

这是避免此类问题的最佳解决scheme。 第1步:创build一个样式

 <style name="ChatBackground" parent="AppBaseTheme"> <item name="android:windowBackground">@drawable/bg_chat</item> </style> 

第2步:在AndroidManifest文件中设置您的活动样式

 <activity android:name=".Chat" android:screenOrientation="portrait" android:theme="@style/ChatBackground" > 

只是为了增加…

如果你有你的活动列表视图你需要添加这个android:isScrollContainer="false"在你的列表视图属性…

不要忘记在您的活动清单xml中添加android:windowSoftInputMode="adjustPan"

如果你们在布局上使用android:windowSoftInputMode="adjustUnspecified"来滚动视图,那么你的背景仍然会被软键盘调整…

如果您使用“adjustPan”值来防止您的背景resize会更好…

如果有人需要adjustResize行为,不希望他的ImageView被resize,这里是另一个解决方法:

只需将ScrollView中的ImageView =>与ScrollView.fillViewport = true的RelativeLayout。

 <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:fillViewport="true"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <FrameLayout android:layout_width="100dp" android:layout_height="100dp"> <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="fitXY" android:src="@drawable/gift_checked" /> </FrameLayout> </RelativeLayout> </ScrollView> 

我在使用我的应用程序时遇到了主要问题。 起初,我使用@parulb提供的方法来解决这个问题。 非常感谢他 但后来我注意到,背景图像是部分隐藏的操作栏(和statusbar我肯定)。 这个小问题已经由@ zgc7009提出,他在一年半以前评论@parulb的回答,但没有人回答。

我花了一整天的时间find一种方法,幸好我现在至less可以在手机上完全解决这个问题。

首先,我们需要在可绘制文件夹中添加一个图层列表资源,将顶部的填充添加到背景图像中:

 <!-- my_background.xml --> <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:top="75dp"> <bitmap android:src="@drawable/bg" /> </item> </layer-list> 

第二,我们把这个文件设置为上面提到的背景资源:

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

我使用的是Nexus 5.我发现了一种方法来获取xml中的actionbar的高度,但不是状态栏,所以我必须使用固定的高度75dp来填充顶部。 希望任何人都可以find这个难题的最后一块。

AndroidManifest.xml文件中添加这一行:

 android:windowSoftInputMode=adjustUnspecified 

请参阅此链接了解更多信息。

我遭受类似的问题,但它似乎像使用adjustPanandroid:isScrollContainer="false"仍然没有解决我的布局(这是一个LinearLayout下面的RecyclerView)。 RecyclerView很好,但是每当虚拟键盘出现时,LinearLayout都会重新调整。

为了防止这种行为(我只是想让键盘经过我的布局),我去了以下代码:

  <activity android:name=".librarycartridge.MyLibraryActivity" android:windowSoftInputMode="adjustNothing" /> 

这告诉Android基本上只有在虚拟键盘被调用时才让你的布局独立。

更多关于可能的选项的阅读可以在这里find(虽然奇怪的是,似乎没有一个调整没有入口)。

我面临着同样的问题,没有一个解决scheme满意我,因为我使用片段作为其他片段之上的一个图层,所以getActivity().getWindow().setBackgroundDrawable()不适用于我。 我的解决scheme是重写FrameLayout与逻辑处理键盘出现,并在旅途中改变位图。 这是我的FrameLayout(kotlin):

`类FlexibleFrameLayout:FrameLayout {

 var backgroundImage: Drawable? = null set(bitmap) { field = bitmap invalidate() } private var keyboardHeight: Int = 0 private var isKbOpen = false private var actualHeight = 0 constructor(context: Context) : super(context) { init() } constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet) { init() } fun init() { setWillNotDraw(false) } override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { super.onMeasure(widthMeasureSpec, heightMeasureSpec) val height = MeasureSpec.getSize(heightMeasureSpec) if (actualHeight == 0) { actualHeight = height return } //kb detected if (actualHeight - height > 100 && keyboardHeight == 0) { keyboardHeight = actualHeight - height isKbOpen = true } if (actualHeight - height < 50 && keyboardHeight != 0) { isKbOpen = false } if (height != actualHeight) { invalidate() } } override fun onDraw(canvas: Canvas) { if (backgroundImage != null) { if (backgroundImage is ColorDrawable) { backgroundImage!!.setBounds(0, 0, measuredWidth, measuredHeight) backgroundImage!!.draw(canvas) } else if (backgroundImage is BitmapDrawable) { val scale = measuredWidth.toFloat() / backgroundImage!!.intrinsicWidth.toFloat() val width = Math.ceil((backgroundImage!!.intrinsicWidth * scale).toDouble()).toInt() val height = Math.ceil((backgroundImage!!.intrinsicHeight * scale).toDouble()).toInt() val kb = if (isKbOpen) keyboardHeight else 0 backgroundImage!!.setBounds(0, 0, width, height) backgroundImage!!.draw(canvas) } } else { super.onDraw(canvas) } } 

}`

然后我用它像一个通常的FrameLayout和我的片段frameLayout.backgroundImage = Drawable.createFromPath(path)

希望它有帮助