Выровнять текст по правому краю в AlertDialog

Можно ли правильно выровнять текст в заголовке и сообщении AlertDialog?

Я показываю сообщения на иврите, но они отображаются с выравниванием влево.

7 ответов

Решение

Насколько я могу видеть из кода AlertDialog а также AlertController вы не можете получить доступ к TextView ответственность за сообщение и заголовок.

Вы можете использовать отражение, чтобы достичь mAlert поле в экземпляре AlertDialog, а затем снова использовать отражение для доступа mMessage а также mTitle поля mAlert, Хотя я бы не рекомендовал этот подход, так как он опирается на внутренние компоненты (которые могут измениться в будущем).


В качестве другого (и, вероятно, гораздо лучшего) решения вы можете применить пользовательскую тему через AlertDialog конструктор. Это позволит вам правильно оправдать все TextView в этом диалоге.

     protected AlertDialog (Context context, int theme)

Это должно быть проще и надежнее.


Вот пошаговые инструкции:

Шаг 1. Создать res/values/styles.xml файл. Вот его содержание:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <style name="RightJustifyTextView" parent="@android:style/Widget.TextView">
        <item name="android:gravity">right|center_vertical</item>
    </style>

    <style name="RightJustifyDialogWindowTitle" parent="@android:style/DialogWindowTitle" >
         <item name="android:gravity">right|center_vertical</item>
    </style>

    <style name="RightJustifyTheme" parent="@android:style/Theme.Dialog.Alert">
        <item name="android:textViewStyle">@style/RightJustifyTextView</item>       
        <item name="android:windowTitleStyle">@style/RightJustifyDialogWindowTitle</item>       
    </style>    

</resources>

Шаг 2. Создать RightJustifyAlertDialog.java файл. Вот его содержание:

public class RightJustifyAlertDialog extends AlertDialog
{
    public RightJustifyAlertDialog(Context ctx)
    {
        super(ctx,  R.style.RightJustifyTheme);
    }
}

Шаг 3. Используйте RightJustifyAlertDialog диалог:

AlertDialog dialog = new RightJustifyAlertDialog(this);
dialog.setButton("button", new OnClickListener()
{           
    public void onClick(DialogInterface arg0, int arg1)
    {

    }
});
dialog.setTitle("Some Title");
dialog.setMessage("Some message");

dialog.show();

Шаг 4. Проверьте результаты:

Это старый вопрос, но есть очень простое решение. Предполагая, что вы используете MinSdk 17Вы можете добавить это к вашему styles.xml:

<style name="AlertDialogCustom" parent="Theme.AppCompat.Dialog.Alert">
    <item name="android:layoutDirection">rtl</item>
</style>

И в AlertDialog.Builder вам просто нужно указать это AlertDialogCustom в конструкторе:

new AlertDialog.Builder(this, R.style.AlertDialogCustom)
                    .setTitle("Your title?")
                    .show();

Если вам нужен быстрый и простой способ сделать это, я бы просто создал и изменил предупреждение по умолчанию, используя AlertDialog.Builder. Вы даже можете создать вспомогательный метод и класс следующим образом:

/** Class to simplify display of alerts. */
public class MyAlert {

    public static void alert(Context context, String title, String message, OnClickListener listener)
    {
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setTitle("My Title");
        builder.setMessage("My message");
        builder.setPositiveButton("OK", listener);
        AlertDialog dialog = builder.show();

        // Must call show() prior to fetching views
        TextView messageView = (TextView)dialog.findViewById(android.R.id.message);
        messageView.setGravity(Gravity.RIGHT);

        TextView titleView = (TextView)dialog.findViewById(context.getResources().getIdentifier("alertTitle", "id", "android"));
        if (titleView != null) {
            titleView.setGravity(Gravity.RIGHT);
       }
    }
}

Конечно, вы можете также изменить гравитацию на CENTER для выравнивания по центру вместо правого или левого по умолчанию.

Поработав с этим в течение часа (приведенные выше решения у меня не сработали), мне удалось выровнять заголовок и сообщение AlertDialog вправо, не переопределяя стили, просто изменив параметры гравитации и макета.

В DialogFragment:

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

    // Set title and message
    try {
        alignDialogRTL(getDialog(), this);
    }
    catch (Exception exc) {
        // Do nothing
    }
}

Фактическая функция:

public static void alignDialogRTL(Dialog dialog, Context context) {
    // Get message text view
    TextView message = (TextView)dialog.findViewById(android.R.id.message);

    // Defy gravity
    message.setGravity(Gravity.RIGHT);

    // Get title text view
    TextView title = (TextView)dialog.findViewById(context.getResources().getIdentifier("alertTitle", "id", "android"));

    // Defy gravity (again)
    title.setGravity(Gravity.RIGHT);

    // Get title's parent layout
    LinearLayout parent = ((LinearLayout)Title.getParent());

    // Get layout params
    LinearLayout.LayoutParams originalParams = (LinearLayout.LayoutParams)parent.getLayoutParams();

    // Set width to WRAP_CONTENT
    originalParams.width = LinearLayout.LayoutParams.WRAP_CONTENT;

    // Defy gravity (last time)
    originalParams.gravity = Gravity.RIGHT |  Gravity.CENTER_VERTICAL;

    // Set updated layout params
    parent.setLayoutParams(originalParams);
}

Все, что вам нужно, это создать тег стиля в res/values/styles и написать:

      <style name="alertDialog LayoutDirection">
<item name="android:layoutDirection">rtl</item>

а затем добавьте это после инициализации диалогового окна предупреждения в вашей деятельности:

      alertDialog.setView(R.style.alertDialog);

Например :

      AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this);
        alertDialog.setMessage("حذف بشه؟")
                .setCancelable(true);
        alertDialog.setPositiveButton("آره", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                Toast.makeText(MainActivity.this, "yes", Toast.LENGTH_SHORT).show();
            }
        });
        alertDialog.setNegativeButton("نه", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                Toast.makeText(MainActivity.this, "nooo", Toast.LENGTH_SHORT).show();
            }
        });

        alertDialog.show();
        alertDialog.setView(R.style.alertDialog);

Котлиновский способ:

val alertDialog = alertDialogBuilder.create()

alertDialog.setOnShowListener {

   alertDialog.window?.decorView?.layoutDirection = View.LAYOUT_DIRECTION_RTL
                               }

alertDialog.show()

Для установки направления компоновки диалогового окна предупреждения на RTL вы можете использовать метод OnShowListener. после установки заголовка, сообщения, .... используйте этот метод.

dialog = alertdialogbuilder.create();

        dialog.setOnShowListener(new DialogInterface.OnShowListener() {
            @Override
            public void onShow(DialogInterface dlg) {
                dialog.getButton(Dialog.BUTTON_POSITIVE).setTextSize(20); // set text size of positive button
                dialog.getButton(Dialog.BUTTON_POSITIVE).setTextColor(Color.RED); set text color of positive button

                dialog.getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL); // set title and message direction to RTL
            }
        });
        dialog.show();
Другие вопросы по тегам