3

I always create custom dialog without title to make it centered (both vertical and horizontal) using android:windowNoTitle in styles.xml or requestWindowFeature(Window.FEATURE_NO_TITLE) but some of my dialogs are not center horizontal, for example this dialog:

<?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>

This is how to create dialog:

@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;
}

And here is how it appears on screen

enter image description here

If I remove android:windowNoTitle attribute this dialog show correctly so the problem only occurs when using dialog without title.

Does anyone know why this happen and how to make dialog always center on screen?

4

4 回答 4

2

你试过看这个线程吗?

如何在android中对齐自定义对话框中心?

 android:layout_gravity="center" 

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

于 2013-07-19T17:56:03.883 回答
2

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

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();
}

这与文档中的完成方式非常相似:创建自定义布局

于 2013-07-19T18:00:06.990 回答
1

我相信您正在降低对话框的最小宽度属性。它可以被发现为

<item type="dimen" name="dialog_min_width_major">65%</item>

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

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

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

为什么删除标题后它会改变?我不知道。您可以通过调整中的填充/布局参数来破解它onMeasure,但似乎应该有一种更清洁的方法来做到这一点。

于 2013-07-19T20:02:35.360 回答
0

仍然不知道为什么删除标题会使Dialog不水平居中但是当我设置min_widthattr of LinearLayout= dialogminWidth这个问题就消失了。

于 2013-07-24T08:47:09.400 回答