Мне было интересно, если кто-нибудь может мне помочь. Я пытаюсь создать собственный AlertDialog. Для этого я добавил следующую строку кода в styles.xml
<resources>
<style name="CustomAlertDialog" parent="android:Theme.Dialog.Alert">
<item name="android:windowBackground">@drawable/color_panel_background</item>
</style>
</resources>
- color_panel_background.9.png находится в папке для рисования. Это также доступно в папке Android SDK res.
Ниже приводится основной вид деятельности.
package com.customdialog;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
public class CustomDialog extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
this.setTheme(R.style.CustomAlertDialog);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("HELLO!");
builder .setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
//MyActivity.this.finish();
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
//dialog.cancel();
}
});
AlertDialog alertdialog = builder.create();
alertdialog.show();
}
}
Чтобы применить тему к AlertDialog, мне нужно было установить тему в текущем контексте.
Тем не менее, я просто не могу заставить приложение показывать настроенный AlertDialog. Кто-нибудь может мне помочь с этим?
Ответы:
В Dialog.java (Android src) используется ContextThemeWrapper. Таким образом, вы можете скопировать идею и сделать что-то вроде:
AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(this, R.style.AlertDialogCustom));
А затем сделайте стиль, как вы хотите:
источник
@android:style/Theme.Dialog
публичный? Можно ли использовать вместо этого?Theme.AppCompat.Light.Dialog.Alert
стиль в качестве родителя вашего собственного стиля. Но, если вы сделаете это, убедитесь, что вы импортируете,import android.support.v7.app.AlertDialog;
а неimport android.app.AlertDialog
У меня была
AlertDialog
проблема, связанная с этой темой, с использованием SDK 1.6, как описано здесь: http://markmail.org/message/mj5ut56irkrkc4nrЯ решил проблему, выполнив следующее:
Надеюсь это поможет.
источник
Я написал в своем блоге статью о том, как настроить макет AlertDialog с помощью файлов стилей XML. Основная проблема заключается в том, что вам нужны разные определения стилей для разных параметров макета. Вот пример, основанный на стиле AlertDialog Holo Light Platform версии 19 для файла стиля, который должен охватывать множество стандартных аспектов макета, таких как размеры текста и цвета фона.
источник
источник
Я боролся с этим - вы можете стилизовать фон диалога, используя
android:alertDialogStyle="@style/AlertDialog"
в вашей теме, но он игнорирует любые настройки текста, которые у вас есть. Как сказал выше @rflexor, это невозможно сделать с помощью SDK до Honeycomb (хорошо, что вы можете использоватьReflection
).Вкратце, мое решение состояло в том, чтобы стилизовать фон диалогового окна, используя описанное выше, а затем установить пользовательский заголовок и представление контента (используя макеты, такие же, как в SDK).
Моя обертка:
alert_dialog_title.xml (взято из SDK)
alert_dialog_message.xml
Тогда просто используйте
CustomAlertDialogBuilder
вместо того,AlertDialog.Builder
чтобы создавать свои диалоги, и просто звонитеsetTitle
иsetMessage
как обычно.источник
Вы можете напрямую назначить тему при запуске Builder:
Затем настройте свою тему в своем
values/styles.xml
источник
Theme.AppCompat.Light.Dialog.Alert
Для Пользовательского Диалога:
просто позвоните,
super(context,R.style.<dialog style>)
а неsuper(context)
в диалоговом конструктореДля AlertDialog:
Просто создайте alertDialog с помощью этого конструктора:
источник
Я думаю, что это не может быть сделано. По крайней мере, не с Строителем. Я работаю с 1.6 и реализация в Builder.create ():
который вызывает конструктор AlertDialog, не связанный с темой, который выглядит следующим образом:
В AlertDialog есть второй конструктор для смены тем:
что Строитель просто не звонит.
Если бы диалог в любом случае был довольно универсальным, я бы попытался написать подкласс AlertDialog, вызвать второй конструктор и использовать этот класс вместо механизма Builder.
источник
Лучший способ сделать это - использовать настраиваемое диалоговое окно и настраивать его в соответствии с вашими потребностями. Вот пример настраиваемого диалогового окна .....
}
Вот макет XML
источник
Любой, кто пытается сделать это во фрагменте (используя библиотеку поддержки, т.е. предварительно API 11), должен пойти с этим:
@Rflexor подтолкнул меня расширить AlertDialog и раскрыть конструктор, спасибо
источник
AlertDialog.Builder(Context, int)
работает только на API 11 и выше. Ваш код будет зависать на более ранних версиях Android.Решение Арве Уолтина выглядит хорошо, хотя я еще не проверял его. Существует еще одно решение в случае , если у вас есть проблемы при получении , что к работе .... Расширение
AlertDialog.Builder
и переопределить все методы (например.setText
,setTitle
,setView
И т.д.) не установлен фактический Диалог текст / название / вид, но и создать новый вид внутри View of Dialog делает все возможное. Тогда вы можете оформить все как угодно.Чтобы уточнить, что касается родительского класса, представление установлено, и ничего больше.
Что касается вашего пользовательского расширенного класса, все делается в этом представлении.
источник
Я не уверен, как решение Arve будет работать в пользовательском диалоге с компоновщиком, где представление раздувается через LayoutInflator.
Решение должно состоять в том, чтобы вставить ContextThemeWrapper в инфлятор через
cloneInContext()
:источник
Это можно сделать просто с помощью setView () в Builder. Вы можете создать любой вид по вашему выбору и подать в строителя. Это хорошо работает. Я использую пользовательский TextView, который отображается в диалоговом окне. Я не устанавливаю сообщение, и это пространство используется для отображения моего обычного текста.
источник
источник