没有标题的Android对话框没有水平居中

时间:2013-07-19 07:11:15

标签: android dialog

我总是创建没有标题的自定义对话框,使用android:windowNoTitlestyles.xml中的requestWindowFeature(Window.FEATURE_NO_TITLE)使其居中(垂直和水平),但我的某些对话框不是中心水平的,例如这个对话框:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"    
android:padding="20dp"
android:gravity="center"
android:background="@drawable/dialog_bg" >

<include 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    layout="@layout/loading_s"/>

<TextView
    android:id="@+id/message"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="20dp"
    android:gravity="center_vertical"
    android:text="@string/loading"
    android:textColor="@color/dialog_text"
    android:textSize="@dimen/dialog_title_text_size" />

</LinearLayout>
  

这是创建对话框的方法:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
    View v = LayoutInflater.from(getActivity()).inflate(R.layout.dlg_progress, null);
    Dialog dlg = new Dialog(getActivity(), R.style.My_Dialog_Style); //My_Dialog_Style contains android:windowNoTitle = true
    dlg.setContentView(v);
    dlg.setCanceledOnTouchOutside(false);   
    dlg.setCancelable(true);
    return dlg;
}

以下是它在屏幕上的显示方式

enter image description here

如果我删除了android:windowNoTitle属性,则此对话框显示正确,因此仅在使用没有标题的对话框时才会出现问题。

有谁知道为什么会发生这种情况以及如何让对话始终以屏幕为中心?

4 个答案:

答案 0 :(得分:2)

当您使用Builder并使用setView设置自定义视图时,无需删除Dialog的标题,并且对话框应居中。

public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    LayoutInflater inflater = getActivity().getLayoutInflater();
    builder.setView(inflater.inflate(R.layout.dlg_progress, null));
    return builder.create();
}

这与文档中的完成方式非常类似:Creating a Custom Layout

答案 1 :(得分:1)

你试过看过这个帖子吗?

How to align custom dialog centre in android ?

 android:layout_gravity="center" 

看起来它只是一个布局更改,或尝试使用relativeLayout或LinearLayout而不是FrameLayout

答案 2 :(得分:1)

我相信你正在低于对话框的最小宽度属性。它可以作为

找到
<item type="dimen" name="dialog_min_width_major">65%</item>
在Android的框架中

。它取决于您正在查看的values文件夹,因此根据密度,方向等而有所不同。

您可以在自己的风格中覆盖此值。如果将它设置为明确小于对话框(10%)的东西,它可能正常工作。如果没有,请继续阅读。

如果您在视图树面板中发现,它会显示嵌套在3个FrameLayouts内的LinearLayout。我的猜测是,最深的FrameLayout的宽度设置为wrap_content,因此它不会填充父布局,只会与LinearLayout一样大。但是,我不能确定,因为你的照片中的尺寸被砍掉了。

删除标题后为什么会改变?我不知道。您可以通过调整onMeasure中的填充/布局参数来破解它,但似乎应该有更简洁的方法来执行此操作。

答案 3 :(得分:0)

仍然不知道为什么删除标题会使Dialog不能水平居中,但当我设置min_width = LinearLayout对话minWidth时,这个问题就消失了。