显示为Dialog的DialogFragment在方向更改时调整为全屏

时间:2016-03-23 17:01:27

标签: android android-dialogfragment

我正在实施一个包含两个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()中显示一个新对话框。 或者,如果屏幕尺寸很大,我可以根据DialogFragmentAlertDialog使用setContentView()

是否有其他方法可以修复指南中的示例代码?

修改 我想尽可能接近“一种布局适合所有尺寸”的方法。

我对“onCreateView()”的实现受到了扩展的启发 示例代码,所以我在上面的文本中添加了相关部分。

2 个答案:

答案 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