android:windowSoftInputMode =“adjustResize”没有任何区别?

我有一个使用这个布局的人造对话框:

<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="match_parent" android:layout_width="match_parent" android:id="@+id/containerPageConatiner"> <FrameLayout android:id="@+id/dialogHolder" android:layout_height="wrap_content" android:layout_width="wrap_content" android:padding="15dp" android:layout_gravity="center" android:background="@drawable/panel_picture_frame_bg_focus_blue"/> </FrameLayout> 

我根据正在打开的对话框在<FrameLayout>放置一个片段 – 控制Dialog的活动如下所示:

 <activity android:label="@string/app_name" android:name=".activity.DialogActivity" android:theme="@style/CustomTheme.Screen.Transparent" android:windowSoftInputMode="adjustResize"> 

不幸的是,当你点击对话框中的编辑文本时,不会发生大小调整。 windowSoftInputMode从字面上看没有区别,因为function与平移模式相同。

文档说:“这当然只适用于具有可调整空间的可调整区域的应用程序”,但并没有告诉你“可resize的区域”是什么意思,使我觉得在某种程度上,有一个可调整的区域?

如果有人知道什么可以帮助我吗?

编辑

围绕这样的对话不会改变任何事情:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/containerPageConatiner" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <View android:layout_width="0dp" android:layout_height="0dp" android:layout_weight="1" /> <FrameLayout android:id="@+id/dialogHolder" android:layout_height="wrap_content" android:layout_width="wrap_content" android:padding="15dp" android:layout_gravity="center" android:background="@drawable/panel_picture_frame_bg_focus_blue"/> <View android:layout_width="0dp" android:layout_height="0dp" android:layout_weight="1" /> </LinearLayout> 

EDIT2

滚动视图作为父母不帮助:

 <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/containerPageConatiner" android:layout_width="match_parent" android:layout_height="match_parent" > <FrameLayout android:id="@+id/dialogHolder" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:padding="15dp" /> </ScrollView> 

我创build了一个新项目,试图获得适用于窗口大小调整的基本function,并慢慢地将其移至项目的目标层面。 这样做我跟踪了这​​个问题:

在我的主题层次结构中,我有这个属性:

 <item name="android:windowFullscreen">true</item> 

被埋没在Theme.Black.NoTitleBar.FullScreen级别 – 我的自定义主题的祖先。

文档build议这是一个“标志,指示这个窗口是否应该填满整个屏幕”。 这听起来像是一件好事,如果你有一个应用程序,占用整个屏幕…除了仍然占用整个屏幕没有国旗。

事实上,一旦你把这个出来,应用程序绝对没有改变…除了adjustResize现在完美的作品。

一段时间后,我也在我创build的图书馆有同样的问题。 ( MaterialDrawer )

据我所见所有提供的答案不解决主要问题,他们只是指出删除全屏标志( android:windowFullscreen ),这是许多在那里没有解决scheme。

上面提到的“问题”只出现在API版本19(KITKAT)开始的Android版本中,因为它们改变了行为。 要正确,这是没有问题的,它是按照预期工作的。 查看Android员工的评论( Android发行 )。


所以我开始挖掘Android源代码,并通过使用ViewTreeObserver.OnGlobalLayoutListener来find以下解决scheme,并在键盘显示/隐藏时作出反应。 如果键盘显示我添加填充到容器视图的底部,然后将模拟adjustResize会做相同的。


为了简化使用,我已经将整个事情包装在一个简单的KeyboardUtil帮助器类中。

 /** * Created by mikepenz on 14.03.15. * This class implements a hack to change the layout padding on bottom if the keyboard is shown * to allow long lists with editTextViews * Basic idea for this solution found here: http://stackoverflow.com/a/9108219/325479 */ public class KeyboardUtil { private View decorView; private View contentView; public KeyboardUtil(Activity act, View contentView) { this.decorView = act.getWindow().getDecorView(); this.contentView = contentView; //only required on newer android versions. it was working on API level 19 (Build.VERSION_CODES.KITKAT) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { decorView.getViewTreeObserver().addOnGlobalLayoutListener(onGlobalLayoutListener); } } public void enable() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { decorView.getViewTreeObserver().addOnGlobalLayoutListener(onGlobalLayoutListener); } } public void disable() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { decorView.getViewTreeObserver().removeOnGlobalLayoutListener(onGlobalLayoutListener); } } //a small helper to allow showing the editText focus ViewTreeObserver.OnGlobalLayoutListener onGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Rect r = new Rect(); //r will be populated with the coordinates of your view that area still visible. decorView.getWindowVisibleDisplayFrame(r); //get screen height and calculate the difference with the useable area from the r int height = decorView.getContext().getResources().getDisplayMetrics().heightPixels; int diff = height - r.bottom; //if it could be a keyboard add the padding to the view if (diff != 0) { // if the use-able screen height differs from the total screen height we assume that it shows a keyboard now //check if the padding is 0 (if yes set the padding for the keyboard) if (contentView.getPaddingBottom() != diff) { //set the padding of the contentView for the keyboard contentView.setPadding(0, 0, 0, diff); } } else { //check if the padding is != 0 (if yes reset the padding) if (contentView.getPaddingBottom() != 0) { //reset the padding of the contentView contentView.setPadding(0, 0, 0, 0); } } } }; /** * Helper to hide the keyboard * * @param act */ public static void hideKeyboard(Activity act) { if (act != null && act.getCurrentFocus() != null) { InputMethodManager inputMethodManager = (InputMethodManager) act.getSystemService(Activity.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow(act.getCurrentFocus().getWindowToken(), 0); } } } 

然后,您可以通过执行以下操作在您的活动或片段中使用它:

 //initialize the KeyboardUtil (you can do this global) KeyboardUtil keyboardUtil = new KeyboardUtil(activity, getContent().getChildAt(0)); //enable it keyboardUtil.enable(); //disable it keyboardUtil.disable(); 

整个util类用在上面提到的库MaterialDrawer中 ,可以在这里findKeyboardUtil 。 这将始终包含最新版本。 (如果有改进)

看起来问题出在FrameLayout上,因为它performance得如此,每个孩子都占用了该框架的可见空间,因此不需要resize以适合孩子。 尝试使用RelativeLayout。 它应该工作。

尝试把你的LinearLayout放在一个ScrollView ,这对我来说一次。

没有使用ScrollView作为我的父母,我刚刚添加了android:fitsSystemWindows="true"到我的父视图(这是一个RelativeLayoutadjustResize到活动的清单,它的工作。

我必须设置

 <item name="android:windowFullscreen">false</item> 

尽pipe如此,我从来没有把它设置为真,应用程序实际上并不是全屏。

当全屏标志被分配给一个活动时,当发现原始的海报时,android:windowFullscreen属性将不起作用,所以当软键盘可见并且不能滚动时,你的窗口将不会resize。

只要删除全屏幕标志而不使用全屏主题,就可以在软键盘可见时进行滚动。

确保在样式中将windowTranslucentStatus设置为false