Android上的自定义对话框:如何将其标题集中在一起?

时间:2010-10-26 16:11:26

标签: android modal-dialog

我正在开发一个Android应用程序。

如何将我正在使用的自定义对话框的标题居中?

感谢。

13 个答案:

答案 0 :(得分:100)

以编程方式完成此操作的另一种方法是使用set Custom Title():

// Creating the AlertDialog with a custom xml layout (you can still use the default Android version)
AlertDialog.Builder builder = new AlertDialog.Builder(this);
LayoutInflater inflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.viewname, null);
builder.setView(view);

TextView title = new TextView(this);
// You Can Customise your Title here 
title.setText("Custom Centered Title");
title.setBackgroundColor(Color.DKGRAY);
title.setPadding(10, 10, 10, 10);
title.setGravity(Gravity.CENTER);
title.setTextColor(Color.WHITE);
title.setTextSize(20);

builder.setCustomTitle(title);

答案 1 :(得分:56)

在试图找出如何做同样的事情的同时找到了这篇文章。以下是我为将来发现这一点的其他人做的事情。

样式xml如下:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <style name="PauseDialog" parent="@android:style/Theme.Dialog">
            <item name="android:windowTitleStyle">@style/PauseDialogTitle</item>
        </style>

        <style name="PauseDialogTitle" parent="@android:style/TextAppearance.DialogWindowTitle">
            <item name="android:gravity">center_horizontal</item>
        </style>
        <style name="DialogWindowTitle">
        <item name="android:maxLines">1</item>
        <item name="android:scrollHorizontally">true</item>
        <item name="android:textAppearance">@android:style/TextAppearance.DialogWindowTitle</item>
        </style>
    </resources>

在我想要设置样式的对话框的onCreateDialog方法的活动中,我创建了这样的对话框:

Dialog pauseDialog = new Dialog(this, R.style.PauseDialog);
pauseDialog.setTitle(R.string.pause_menu_label);
pauseDialog.setContentView(R.layout.pause_menu);

答案 2 :(得分:8)

您也可以在代码中执行此操作。假设您有对话框片段,然后添加以下代码行。

@Override
public void onStart()
{
    super.onStart();

    TextView textView = (TextView) this.getDialog().findViewById(android.R.id.title);
    if(textView != null)
    {
        textView.setGravity(Gravity.CENTER);
    }
}

答案 3 :(得分:2)

您可以在没有自定义视图的情况下以编程方式执行此操作:

@Override
public void onStart()
{
    super.onStart();

    TextView textViewVanilla = (TextView) this.getDialog().findViewById(android.R.id.title);
    if(textViewVanilla != null)
    {
        textViewVanilla.setGravity(Gravity.CENTER);
    }
    // support for appcompat v7
    TextView textViewAppcompat = (TextView) this.getDialog().findViewById(android.support.v7.appcompat.R.id.alertTitle);
    if(textViewAppcompat != null)
    {
        textViewAppcompat.setGravity(Gravity.CENTER);
    }
}

感谢@hesam这个想法。对于appcompat布局,请参阅Android/sdk/platforms/android-26/data/res/layout/alert_dialog_title_material.xml

答案 4 :(得分:1)

如果您不致电AlertDialog.Builder.setIcon()AlertDialog.Builder.setTitle(),那么您的自定义对话框将不会显示内置/默认标题视图。在这种情况下,您可以添加自定义标题视图:

AlertDialog.Builder.setView(View view)

只要您创建此View,就可以实现任何类型的对齐。

答案 5 :(得分:1)

对于自定义DialogFragment,您可以执行以下操作:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    final Dialog dialog = super.onCreateDialog(savedInstanceState);
    final TextView textView = (TextView) dialog.findViewById(android.R.id.title);
    if(textView != null) {
        textView.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
    }
    return dialog;
}

答案 6 :(得分:1)

TextView titleView = (TextView) dialog.findViewById(android.R.id.title);
if(titleView != null) {
titleView.setGravity(Gravity.CENTER);
}

有关详细信息,请参阅this KodeCenter article on Android Dialog and AlertDialog

答案 7 :(得分:0)

您可以在此处获得一些修改对话框标题的提示: Android - change custom title view at run time 不知道它是否可以居中(尚未尝试过),但如果它是自定义视图,我猜它很有可能。

答案 8 :(得分:0)

这是一个令人讨厌的解决方案......扩展AlertDialog.Builder并覆盖所有方法(例如setText,setTitle,setView等)以不设置实际Dialog的文本/标题/视图,而是在其中创建新视图Dialog的视图在那里做所有事情。然后你随心所欲地设计一切。

为了澄清,就父类而言,View已设置,而不是其他任何内容。

就您的自定义扩展类而言,所有内容都在该视图中完成。

答案 9 :(得分:0)

试试这个:

TextView titleText = (TextView) helpDialog.findViewById(R.id.alertTitle);
if(titleText != null) {
    titleText.setGravity(Gravity.CENTER);
}

完整代码(使用android.support.v7.app.AlertDialog):

 AlertDialog.Builder helpDialogBuilder = new AlertDialog.Builder(context)
        .setTitle(/*your title*/)
        .setMessage(/*your message*/)
        .setNegativeButton("Cancel",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        /*you can do something here*/

                        dialog.dismiss();
                    }
                })
        .setPositiveButton("OK",
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        /*you can do something here*/

                        dialog.dismiss();
                    }
                });

final AlertDialog helpDialog = helpDialogBuilder.create();

helpDialog.setOnShowListener(new DialogInterface.OnShowListener() {
    @Override
    public void onShow(DialogInterface dialog) {

        TextView titleText = (TextView) helpDialog.findViewById(R.id.alertTitle);
        if(titleText != null) {
            titleText.setGravity(Gravity.CENTER);
        }

        TextView messageText = (TextView) helpDialog.findViewById(android.R.id.message);
        if(messageText != null) {
            messageText.setGravity(Gravity.CENTER);
        }
    }
});

helpDialog.show(); 

答案 10 :(得分:0)

    AlertDialog alertDialog = new AlertDialog.Builder(activity)

            .setMessage(message)
            .create();
    alertDialog.setIcon(R.mipmap.ic_launcher_round);

    @SuppressLint("RestrictedApi")
    DialogTitle titleView=new DialogTitle(activity);
    titleView.setText(title);
    titleView.setPaddingRelative(32,32,32,0);
    alertDialog.setCustomTitle(titleView);

答案 11 :(得分:0)

类似于@LandL Partners解决方案,但在Kotlin中:

val builder = AlertDialog.Builder(this)
val inflater = this.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater

val view = inflater.inflate(R.layout.viewname, null)
builder.setView(view)
val title = TextView(this)
title.setText("Custom Centered Title")
title.setBackgroundColor(Color.DKGRAY)
title.setPadding(10, 10, 10, 10)
title.setGravity(Gravity.CENTER)
title.setTextColor(Color.WHITE)
title.setTextSize(20)

builder.setCustomTitle(title)

答案 12 :(得分:0)

在Kotlin中,您可以在1行中完成

dialog!!.window!!.attributes = dialog!!.window!!.attributes.apply { dimAmount = 0F }