标题不在 AlertDialog 上垂直居中

Posted

技术标签:

【中文标题】标题不在 AlertDialog 上垂直居中【英文标题】:Title not center vertically on AlertDialog 【发布时间】:2015-06-30 12:58:25 【问题描述】:

我有一个AlertDialog 标题,当对话框的消息内容不需要滚动时,该标题将垂直居中,如下所示:

现在当消息内容需要滚动时,标题不再垂直居中,如下所示:

我最初尝试使用以下方法设置标题和图标:

builder.setTitle("Help");
builder.setIcon(R.drawable.help);

并且标题不在上面代码的第二种情况下居中。此后,我尝试切换到标题的 XML 布局并使用 builder.setCustomTitle(...); 设置标题,并使用以下 XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:minHeight="72dp"
    android:orientation="horizontal"
    android:gravity="center_vertical"
    android:paddingLeft="14dp">

<ImageView
    android:layout_
    android:layout_
    android:src="@drawable/help"/>

<TextView
    android:layout_
    android:layout_
    android:text="Help"
    android:textSize="24sp"
    android:textColor="#ff33b5e5"/>

</LinearLayout>

我已经尝试过属性minHeightgravitylayout_gravitypadding。我已经能够使用padding 属性在第二种情况下将标题居中,但是第一种情况下的标题不再居中。虽然padding 可以工作,但我想找到一个解决方案,使标题在每种情况下都居中,而与消息是否需要滚动无关。我觉得我忽略了一些简单和/或直接的事情。

另外,消息内容使用builder.setMessage();简单设置。

编辑 1: 我应该澄清一下,我不希望标题水平居中,只希望垂直左对齐加上边距/填充。最终,我希望每个标题栏都像上面的第一张图片一样。

编辑 2:这是对话框的 java 代码,如果有帮助的话:

public class HelpDialog extends DialogFragment
// Bundle variables/args
final static String ARG_HELP = "help";

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    LayoutInflater inflater = getActivity().getLayoutInflater();
    View view = inflater.inflate(R.layout.custom_help_title, null);

    Bundle args = getArguments();

    //initial way it was done
    //builder.setTitle("Help");
    //builder.setIcon(R.drawable.help);

    //now with the custom xml
    builder.setCustomTitle(view);
    builder.setMessage(args.getCharSequence(ARG_HELP));
    builder.setPositiveButton("Done", new DialogInterface.OnClickListener() 
        public void onClick(DialogInterface dialog, int which) 
            dismiss();
        
    );

    return builder.create();


【问题讨论】:

【参考方案1】:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
    TextView title_txt = new TextView(this);
    title_txt.setGravity(Gravity.CENTER_HORIZONTAL);
    title_txt.setText("Hello");
    title_txt.setTextSize(16);
    builder.setCustomTitle(title_txt);
    builder.setPositiveButton("Yes",
            new DialogInterface.OnClickListener() 
    
                @Override
         public void onClick(DialogInterface dialog, int which) 
         
         

    );
    builder.setNegativeButton("No",
            new DialogInterface.OnClickListener() 
   
            @Override
            public void onClick(DialogInterface dialog, int which) 
            
                dialog.dismiss();

            
    );
   builder.show();

【讨论】:

此代码适用于出现在中心的标题。谢谢 此代码中的 TextView 是动态创建的,因此您不需要在 xml 文件中... 在上述第二种情况下,这仍然将标题向上推,而不是居中。 删除填充然后尝试 您的对话框消息是否大于屏幕高度,因此需要您滚动消息?那是我遇到这些问题的时候,否则标题就很好了。【参考方案2】:

您是否尝试过将重力设置为“中心”?摆脱填充等。

【讨论】:

这将标题水平居中,但垂直仍然不在标题中居中。 尝试将重力值设置为center_horizo​​ntal|center_vertical 这就是我所拥有的,并且视图仍然没有真正居中。 使根成为RelativeLayout。在这里面有一个LinearLayout,它的宽度和高度是wrap_content。线性布局包含您的图标和文本视图。将 layout_centerInParent 属性添加到线性布局并将其设置为 true。 那还是不行。不过感谢您的努力。【参考方案3】:

所以我最终使用包含消息 TextView 的更自定义的 XML 布局来解决这个问题,而不是使用 .setMessage()

XML 最终变成:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:orientation="vertical">

<LinearLayout
    android:layout_
    android:layout_
    android:orientation="horizontal"
    android:gravity="center_vertical"
    android:padding="10dp">

    <ImageView
        android:layout_
        android:layout_
        android:gravity="center_vertical"
        android:src="@drawable/help"/>

    <TextView
        android:layout_
        android:layout_
        android:gravity="center_vertical"
        android:text="Help"
        android:textSize="24sp"
        android:textColor="#ff33b5e5"/>
</LinearLayout>

<View android:id="@+id/titleDivider"
    android:layout_
    android:layout_
    android:background="#ff33b5e5" />

<TextView
    android:id="@+id/message"
    android:layout_
    android:layout_
    android:maxLines="16"
    android:minLines="3"
    android:scrollbars="vertical"
    android:fadeScrollbars="false"
    android:textSize="20sp"
    android:padding="7dp"/>

</LinearLayout>

Java 代码最终变成:

public class HelpDialog extends DialogFragment
// Bundle variables/args
final static String ARG_HELP = "help";

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    LayoutInflater inflater = getActivity().getLayoutInflater();
    View view = inflater.inflate(R.layout.custom_help_title, null);

    Bundle args = getArguments();

    builder.setView(view);

    TextView message = (TextView) view.findViewById(R.id.message);
    message.setMovementMethod(ScrollingMovementMethod.getInstance());
    message.setText(args.getCharSequence(ARG_HELP));

    builder.setPositiveButton("Done", new DialogInterface.OnClickListener() 
        public void onClick(DialogInterface dialog, int which) 
            dismiss();
        
    );

    return builder.create();


为了使较大消息的滚动功能正常运行,使用了here 的解决方案。

这段代码给了我以下结果:

【讨论】:

以上是关于标题不在 AlertDialog 上垂直居中的主要内容,如果未能解决你的问题,请参考以下文章

vue 弹性布局 实现长图垂直居上,短图垂直居中

绝对定位情况下水平垂直居中小技巧

如何在堆栈中垂直或水平居中小部件?

-水平居中垂直居中水平垂直居中

移动端利用-webkit-box水平垂直居中

iOS 5.0 Safari 不在文本框中垂直居中占位符