DialogFragment 在打开软键盘时总是调整大小
DialogFragment is always resized when soft keyboard is opened
我在使用全屏显示的自定义 DialogFragment 时遇到一些问题。此对话框包含可滚动的内容并具有自动完成文本视图。
最初显示的对话框顶部有一个边距 - 以编程方式设置为布局内容顶部的透明视图。一旦 autocompletetextview 获得焦点,这个边距就会减少到 0(从而给人一种对话框进入全屏模式的错觉)。此时键盘也显示出来了
目前,键盘缩小了对话框的大小,对话框上的一个按钮上移到键盘上方。这会产生一个问题,因为一旦 autocompletetextview 失去焦点,对话框就会调整大小,并且由于键盘调整大小也会产生闪烁:
他们的键盘是隐藏的 -> 对话框被移到底部
-> 对话框调整为全屏
-> 对话框调整为初始大小
当前创建的对话框:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = super.onCreateDialog(savedInstanceState);
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);
if (!hasTitle()) {
dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
}
// the content
//final RelativeLayout root = new RelativeLayout(getActivity());
//root.setLayoutParams(
// new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
//dialog.setContentView(root);
if (position != null) {
WindowManager.LayoutParams windowParams = dialog.getWindow().getAttributes();
windowParams.x = position.x;
windowParams.y = position.y;
dialog.getWindow().setAttributes(windowParams);
} else {
dialog.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
}
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(hasTitle() ? Color.WHITE : Color.TRANSPARENT));
dialog.getWindow().setGravity(Gravity.TOP | Gravity.START);
return dialog;
}
部分有效,因为对话框没有填满宽度,它小了很多。
有些东西确实解决了这个问题,但它产生了另一个问题:
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setStyle(DialogFragment.STYLE_NO_FRAME, android.R.style.Theme_DeviceDefault_DialogWhenLarge_NoActionBar);
}
但这会影响对话框背景的外观,我似乎无法从对话框创建方法中更改它。
你可以为此做一件事...
在您的 onViewCreated 中添加:
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
super.onViewCreated(view, savedInstanceState);
}
使用“adjustPan” activity 的主要 window 未调整大小以为软键盘腾出空间 因此在这种情况下,片段页面的所有视图都应位于 ScrollView 中,否则用户可能需要关闭软键盘才能找到 window.
的模糊部分并与之交互
希望对您有所帮助。
我终于找到了解决问题的方法。
对话框的创建:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = super.onCreateDialog(savedInstanceState);
if (!hasTitle()) {
dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
}
if (position != null) {
WindowManager.LayoutParams windowParams = dialog.getWindow().getAttributes();
windowParams.x = position.x;
windowParams.y = position.y;
dialog.getWindow().setAttributes(windowParams);
} else {
WindowManager.LayoutParams attrs = dialog.getWindow().getAttributes();
attrs.flags &= ~WindowManager.LayoutParams.FLAG_FULLSCREEN;
dialog.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
}
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(hasTitle() ? Color.WHITE : Color.TRANSPARENT));
dialog.getWindow().setGravity(Gravity.TOP | Gravity.START);
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
return dialog;
}
fragment的创建(我自定义了dialog的样式-使用很重要No_FRAME):
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// We customize the style of this dialog - we remove the frames of the dialogs and leave the drawing to the
// onCreateView() method, and we use the custom theme for dialogs - this is a special theme which has no
// Background and the status bar is left unchanged
setStyle(DialogFragment.STYLE_NO_FRAME, R.style.Theme_Dialog);
}
自定义主题(我重用了我所有的样式,所以对话框看起来一样):
<!-- Custom theme for dialogs - this will use the same styling as the main theme, but will disable the background
of the window, and it will also leave the status bar color unchanged -->
<style name="Theme.Dialog">
<item name="android:windowBackground">@android:color/transparent</item>
<!-- We do not want to change the status bar color -->
<item name="colorPrimaryDark">@color/transparent</item>
</style>
现在我的对话框片段看起来像是全屏的,并且在打开软键盘时不再调整大小,因此在手动更改其大小时会产生闪烁效果。
重要的是 DialogFragment.STYLE_NO_FRAME
.
希望这对遇到类似问题的其他人有所帮助。
我在使用全屏显示的自定义 DialogFragment 时遇到一些问题。此对话框包含可滚动的内容并具有自动完成文本视图。
最初显示的对话框顶部有一个边距 - 以编程方式设置为布局内容顶部的透明视图。一旦 autocompletetextview 获得焦点,这个边距就会减少到 0(从而给人一种对话框进入全屏模式的错觉)。此时键盘也显示出来了
目前,键盘缩小了对话框的大小,对话框上的一个按钮上移到键盘上方。这会产生一个问题,因为一旦 autocompletetextview 失去焦点,对话框就会调整大小,并且由于键盘调整大小也会产生闪烁: 他们的键盘是隐藏的 -> 对话框被移到底部 -> 对话框调整为全屏 -> 对话框调整为初始大小
当前创建的对话框:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = super.onCreateDialog(savedInstanceState);
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);
if (!hasTitle()) {
dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
}
// the content
//final RelativeLayout root = new RelativeLayout(getActivity());
//root.setLayoutParams(
// new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
//dialog.setContentView(root);
if (position != null) {
WindowManager.LayoutParams windowParams = dialog.getWindow().getAttributes();
windowParams.x = position.x;
windowParams.y = position.y;
dialog.getWindow().setAttributes(windowParams);
} else {
dialog.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
}
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(hasTitle() ? Color.WHITE : Color.TRANSPARENT));
dialog.getWindow().setGravity(Gravity.TOP | Gravity.START);
return dialog;
}
部分有效,因为对话框没有填满宽度,它小了很多。
有些东西确实解决了这个问题,但它产生了另一个问题:
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setStyle(DialogFragment.STYLE_NO_FRAME, android.R.style.Theme_DeviceDefault_DialogWhenLarge_NoActionBar);
}
但这会影响对话框背景的外观,我似乎无法从对话框创建方法中更改它。
你可以为此做一件事...
在您的 onViewCreated 中添加:
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
super.onViewCreated(view, savedInstanceState);
}
使用“adjustPan” activity 的主要 window 未调整大小以为软键盘腾出空间 因此在这种情况下,片段页面的所有视图都应位于 ScrollView 中,否则用户可能需要关闭软键盘才能找到 window.
的模糊部分并与之交互希望对您有所帮助。
我终于找到了解决问题的方法。
对话框的创建:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = super.onCreateDialog(savedInstanceState);
if (!hasTitle()) {
dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
}
if (position != null) {
WindowManager.LayoutParams windowParams = dialog.getWindow().getAttributes();
windowParams.x = position.x;
windowParams.y = position.y;
dialog.getWindow().setAttributes(windowParams);
} else {
WindowManager.LayoutParams attrs = dialog.getWindow().getAttributes();
attrs.flags &= ~WindowManager.LayoutParams.FLAG_FULLSCREEN;
dialog.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
}
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(hasTitle() ? Color.WHITE : Color.TRANSPARENT));
dialog.getWindow().setGravity(Gravity.TOP | Gravity.START);
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
return dialog;
}
fragment的创建(我自定义了dialog的样式-使用很重要No_FRAME):
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// We customize the style of this dialog - we remove the frames of the dialogs and leave the drawing to the
// onCreateView() method, and we use the custom theme for dialogs - this is a special theme which has no
// Background and the status bar is left unchanged
setStyle(DialogFragment.STYLE_NO_FRAME, R.style.Theme_Dialog);
}
自定义主题(我重用了我所有的样式,所以对话框看起来一样):
<!-- Custom theme for dialogs - this will use the same styling as the main theme, but will disable the background
of the window, and it will also leave the status bar color unchanged -->
<style name="Theme.Dialog">
<item name="android:windowBackground">@android:color/transparent</item>
<!-- We do not want to change the status bar color -->
<item name="colorPrimaryDark">@color/transparent</item>
</style>
现在我的对话框片段看起来像是全屏的,并且在打开软键盘时不再调整大小,因此在手动更改其大小时会产生闪烁效果。
重要的是 DialogFragment.STYLE_NO_FRAME
.
希望这对遇到类似问题的其他人有所帮助。