我正在实施一个包含两个EditText
字段的对话框。根据Material Design规范,这种对话框应该在较小的设备上全屏显示,而在大屏幕上则应该在对话窗口中显示。
为实现这一目标,我遵循了developer.android.com guide on Dialogs的实施。
这适用于较小的屏幕,但对于大屏幕,对话窗口在方向更改后占据整个屏幕。
显示DialogFragment
的代码(onOptionsItemSelected()
中AppCompatActivity
的一部分)
mIsLargeLayout = getResources().getBoolean(R.bool.large_layout);
FragmentManager fragmentManager = getSupportFragmentManager();
mDialog = MyDialogFragment.newInstance(mIsLargeLayout);
if (mIsLargeLayout)
{
// The device is using a large layout, so show the fragment as a dialog
mDialog.show(fragmentManager, "dialog");
}
else
{
// The device is smaller, so show the fragment fullscreen
FragmentTransaction transaction = fragmentManager.beginTransaction();
// To make it fullscreen, use the 'content' root view as the container
// for the fragment, which is always the root view for the activity
transaction.add(android.R.id.content, mDialog, "dialog")
.addToBackStack(null)
.commit();
}
对于DialogFragment
,我首先覆盖onCreateView()
以扩充我的自定义布局:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
setStyle(DialogFragment.STYLE_NORMAL, R.style.AppTheme);
View v = inflater.inflate(R.layout.dialog_filter_audio_files,
container, false);
// code for Buttons and EditTexts here:
// set listeners etc.
return v;
}
...然后使用以下语句onCreateDialog()
:
Dialog dialog = super.onCreateDialog(savedInstanceState);
dialog.setCancelable(true);
dialog.getWindow().setBackgroundDrawableResource(R.color.c_background_dark);
return dialog;
我不会忽略DialogFragment
方向更改,但在onRestoreInstanceState()
我重新连接到DialogFragment
,如下所示:
mDialog = (DialogFilterAudiofiles) getSupportFragmentManager().findFragmentByTag("dialog");
虽然用户无论看起来如何都能够完成对话,但我希望保持对话框的小 - 就像在方向改变之前一样。
当然,我可以在保存输入后保存onSaveInstanceState()
中的对话框,然后在onRestoreInstanceState()
中显示一个新对话框。
或者,如果屏幕尺寸很大,我可以根据DialogFragment
和AlertDialog
使用setContentView()
。
是否有其他方法可以修复指南中的示例代码?
修改 我想尽可能接近“一种布局适合所有尺寸”的方法。
我对“onCreateView()”的实现受到了扩展的启发 示例代码,所以我在上面的文本中添加了相关部分。
答案 0 :(得分:3)
我终于找到了问题的根源:
setStyle(DialogFragment.STYLE_NORMAL, R.style.AppTheme);
最初工作正常:DialogFragment
创建为全屏对话框或小窗口,具体取决于mIsLargeLayout
的值。
但如果在配置更改后必须重新创建,则此行会使其显示为全屏。
我的期望是值R.style.AppTheme
会使运行时查找作为应用主题一部分的自定义对话框样式,但事实上它只是将DialogFragment
视为一种{ {1}}在配置更改后重新创建。
就我而言,删除整个语句与使用
一样有效Activity
从documentation获取第二个参数:
可选的自定义主题。如果为0,将为您选择适当的主题(基于样式)。
答案 1 :(得分:0)
在布局的根元素中,定义不会填充较大设备的对话框布局中的屏幕的大小。如果这不起作用,请参阅how-to-set-a-maximum-height-with-wrap-content-in-android