Я разрабатываю приложение для Android.
Как я могу центрировать заголовок для настраиваемого диалогового окна, которое я использую?
Я разрабатываю приложение для Android.
Как я могу центрировать заголовок для настраиваемого диалогового окна, которое я использую?
Просто нашел этот пост, пытаясь понять, как сделать то же самое. Вот как я сделал это для всех, кто находит это в будущем.
Стиль 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);
Другим способом, который это может быть сделано программно, является использование setCustomTitle():
// 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);
Вы можете сделать это и в коде. Предположим, что у вас есть фрагмент диалога, а затем добавьте следующие строки кода.
@Override
public void onStart()
{
super.onStart();
TextView textView = (TextView) this.getDialog().findViewById(android.R.id.title);
if(textView != null)
{
textView.setGravity(Gravity.CENTER);
}
}
Вы можете сделать это программно без специального вида:
@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
Если вы не вызываете AlertDialog.Builder.setIcon()
и AlertDialog.Builder.setTitle()
, тогда ваш пользовательский диалог не отображает встроенный/титульный заголовок. В этом случае вы можете добавить свой собственный заголовок. Вид:
AlertDialog.Builder.setView(View view)
Как только вы создаете этот вид, вы можете реализовать любой тип выравнивания.
Для вашего пользовательского 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;
}
TextView titleView = (TextView) dialog.findViewById(android.R.id.title);
if(titleView != null) {
titleView.setGravity(Gravity.CENTER);
}
Подробнее см. эту статью KodeCenter для Android Dialog и AlertDialog.
У вас есть несколько советов по началу работы для изменения названия диалогового окна: Android - изменение пользовательского заголовка во время выполнения Не знаю, может ли он быть центрирован (не пробовал), но если это пользовательский вид, я думаю, это очень возможно.
Вот скверное решение.... Расширьте AlertDialog.Builder и переопределите все методы (например, setText, setTitle, setView и т.д.), чтобы не устанавливать фактический текст/заголовок/просмотр диалога, но для создания нового представления внутри Диалоговый просмотр делает все там. Тогда вы можете свободно создавать все, что пожелаете.
Чтобы уточнить, что касается родительского класса, параметр View установлен и ничего больше.
Что касается вашего расширенного расширенного класса, все это делается в этом представлении.
Попробуйте следующее:
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();
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);
Аналогично решению @LandL Partners, но в Котлине:
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)