Android:自定义对话框的尺寸错误

时间:2012-08-23 13:07:26

标签: android android-layout xamarin.android

我正在尝试显示带有自定义视图的对话框。布局非常简单;基本上有两个LinearLayouts;每个布局都带有TextViewEditText

我正在使用的布局是:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
  <LinearLayout
    android:orientation="vertical"
    android:layout_margin="5dip"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/ll_element1">    
    <TextView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Element 1"/>
    <EditText
      android:layout_width="250dip"
      android:layout_height="wrap_content"
      android:lines="5"/>
  </LinearLayout>
  <LinearLayout
    android:orientation="vertical"
    android:layout_margin="5dip"
    android:layout_width="wrap_content"
    android:layout_below="@id/ll_element1"
    android:layout_height="wrap_content">    
    <TextView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Element 2"/>
    <EditText
      android:layout_width="250dip"
      android:layout_height="wrap_content"
      android:lines="5"/>
  </LinearLayout>
</RelativeLayout>

但如果我将其设置为对话框的视图,则如下所示: Wrong sized dialog

显示对话框的我的代码是:

var view = this.LayoutInflater.Inflate(Resource.Layout.Custom_Dialog, null);

var dialog = new AlertDialog.Builder(this)
            .SetView(view)
            .Create();

dialog.Show();

在我看来,对话框的宽度应该更小,以便布局填充对话框。 我尝试了几件事:

  • 使用LinearLayout而不是RelativeLayout
  • 设置所有尺寸的探索
  • 使用Dialog而不是AlertDialog

那么,我需要做些什么来获得正确大小的对话框?

修改 更新了图片

5 个答案:

答案 0 :(得分:2)

试试这个

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ll_element1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="5dip"
    android:orientation="vertical" >

    <EditText
        android:layout_width="250dip"
        android:layout_height="wrap_content"
        android:hint="Element 1"
        android:lines="5" />

    <EditText
        android:layout_width="250dip"
        android:layout_height="wrap_content"
        android:hint="Element 2"
        android:lines="5" />

</LinearLayout>

在您的活动中

final Dialog dialog = new Dialog(YourActivity.this);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.yourCustomdialog);
dialog.setCancelable(true);
dialog.show();

答案 1 :(得分:1)

删除TextView并在EditText上使用android:hint。将EditText in One LinearLayoutvertical Orientation.

放在一起

同时更改android:layout_width of EditText as fill_parent及其父级。

答案 2 :(得分:1)

您已在lines=5中设置EditText,因此占用了空间。使用dp代替dip,请检查this

现在你想如何显示它?给出一些参考,以便确定确切的问题。

答案 3 :(得分:0)

这些答案都没有帮助我,所以这是我的解决方案(也许有人觉得它很有用)。

我在NumberPicker中显示的AlertDialog出现了类似的问题。 NumberPicker有自己的布局,以相对单位("match_parent"android:layout_weight,...)定义。

没有rootView的展示布局会导致布局使用默认参数,因此布局大小不符合预期。使用rootView扩展布局会导致IllegalStateException“当AlertDialog#create()方法将视图附加到create()时,指定的子项已经有一个父”内部对话框布局。

How to make an alert dialog fill 90% of screen size?中所述,您可以覆盖默认参数,如下所示:

AlertDialog dialog = builder.show();

WindowManager.LayoutParams params = new WindowManager.LayoutParams();
params.copyFrom(dialog.getWindow().getAttributes());
params.width = 300; // LayoutParams.MATCH_PARENT will match dialog_layout which can be stretched to fullwidth.
params.height = 300;
dialog.getWindow().setAttributes(params);

您可以创建dialog_helper.xml,而不是以像素为单位使用固定的宽度和高度,您可以在其中以相对单位(android:id="@+id/dialog_dimension")定义一些透明视图,稍后您将从中复制宽度和高度。然后将此布局包含在活动/片段布局中:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout ...>
    <LinearLayout ....>
        ...
    </LinearLayout>
    <include layout="@layout/dialog_helper"/>
</RelativeLayout>

由于此视图包含在活动布局中,因此它具有“测量”宽度和高度,可用作对话框参数:

View dialogDim = findViewById(R.id.dialog_dimension);
params.width = dialogDim.getMeasuredWidth();
params.height = dialogDim.getMeasuredHeight();

dialog.getWindow().getAttributes()计算相对大小不起作用,因为它包含一些负值常量(MATCH_PARENT或其他)。因此,如果要计算相对于显示大小的对话框大小,请使用screen metrics

注意,在屏幕旋转后将使用相同的宽度和高度,因此我建议将对话框包装到更改设备配置时自动重新创建的DialogFragment,因此将使用更新的{创建对话框{1}}根据当前的屏幕方向。这是一个简单的例子How to create DialogFragment

上一个示例包含活动和片段之间的通信(活动需要接收有关对话事件的消息)。这需要定义自定义侦听器接口+正确覆盖dialogDim方法。以下文章解释了所有这些步骤:Cummunication between Fragment and Activity

答案 4 :(得分:-1)

使用构建器并在显示

的同时添加宽度和高度
builder.show().getWindow().setLayout(600, 250);