忽略对话框片段的宽度和高度

Dialog Fragment width and height ignored

如何设置对话框片段的宽度和高度?我读过的所有内容都说要像这样重写 OnStart 方法:

    public override void OnStart()
    {
        if (Dialog == null)
        {
            return;
        }
        int dialogWidth = 300;
        int dialogHeight = 75;
        Dialog.Window.SetLayout(dialogWidth, dialogHeight);
    }

当我这样做时,应用程序崩溃了,我无法捕获错误,因为它显然在我编写的代码之外失败了。如果没有此覆盖,对话框将按预期出现和运行。

这是我的布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    android:minWidth="300dp" 
    android:minHeight="75dp">
    <TextView
        android:text="Select section."
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textAlignment="center" 
        android:textStyle="bold"
        android:id="@+id/textView2" />
    <Spinner
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textAlignment="center"
        android:id="@+id/my_spinner" />
    <Button
        android:text="Ok"
        android:layout_width="200px"
        android:layout_gravity="center"
        android:layout_height="34.5dp"
        android:id="@+id/button_ok" />
</LinearLayout>

显然 android:minWidthandroid:minHeight 设置被忽略了,因为我得到的只是一个小对话框。

最好在 values 文件夹下的 dimens.xml 中定义尺寸:

<resources>
    ...
    <dimen name="dialog_min_width">300dp</dimen>
    <dimen name="dialog_min_height">75dp</dimen>
    ...
</resources>

您可以按如下方式更新 DialogFragmentonResume() 方法并尝试:

public void onResume() {
    int width = getResources().getDimensionPixelSize(R.dimen.dialog_min_width);
    int height = getResources().getDimensionPixelSize(R.dimen.dialog_min_height);        
    getDialog().getWindow().setLayout(width, height);
    super.onResume();
}

Mehmed 代码的 c# 等价物:

    public override void OnResume()
    {
        int width = 300; 
        int height = 75; 
        base.OnResume();
    }

我发现在 Stack Overflow 上 posted 的很多代码都是 java 代码,我使用的是 c# (Visual Studio 2017) 并且一无所知关于 java 并发现很难转换为 c#,令人沮丧。当我在答案中看到 java 代码时,我通常会直接跳过它。但是看到我问这个问题的方式并且 Mehmed 非常友好地提供了一个可行的解决方案,我觉得有必要 post 进行 c# 转换。

您会注意到我选择不将值放在 dimens.xml 中,我不喜欢将值存储在 "external to the code file" 中然后在代码中检索它们,倾向于调试有时要困难得多。当你这样做时发生的所有事情是编译器用生成的 obj 文件中的值替换代码行,sooooo .. 为什么要这样做?

鉴于这些值永远不会改变,我认为将它们放在 dimens.xml 中没有意义,无论如何要说服我!