Тема не применяется к DialogFragment на Android
Я переключаю свои старые Dialogs на DialogFragment, но темы и стили не работают.
Я использую DialogFragment из библиотеки совместимости v4, а в методе onCreate, который я пробовал, вызывается setStyle (стиль, тема); с большим количеством разных тем, но диалог всегда отображается как "старый" диалог в эмуляторе под управлением Android 4.0.3 (т.е. он не отображается в теме Голо).
Есть ли что-нибудь еще, что я должен делать? Использует ли библиотека совместимости тему Holo или что-то еще? Если это так, следует ли создать два диалоговых окна DialogFragments, один для более старых версий и один для более новых версий?
Спасибо!
Здесь (упрощенный) код для моего диалога. Я пробовал как Theme_Holo_Dialog_NoActionBar, так и Theme_DeviceDefault_Dialog_NoActionBar, но эмулятор Android 4 всегда показывает диалог как "старый" диалог вместо использования темы Holo. Что я делаю не так?:(
[...]
import android.support.v4.app.DialogFragment;
[...]
public class AlertDialogFragment extends DialogFragment {
public static AlertDialogFragment newInstance(int id) {
AlertDialogFragment f = new AlertDialogFragment();
Bundle args = new Bundle();
args.putInt("id", id);
f.setArguments(args);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
int style = DialogFragment.STYLE_NORMAL, theme = 0;
theme = android.R.style.Theme_Holo_Dialog_NoActionBar;
setStyle(style, theme);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
mId = getArguments().getInt("id");
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
.setTitle(mTitle)
.setMessage(mMessage)
.setPositiveButton(getString(R.string.btn_ok), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dismiss();
}
});
return builder.create();
}
Ответы
Ответ 1
Я считаю, что вам нужно установить тему на фактическом диалоге, а не на фрагменте
Используйте этот конструктор для создания своего AlertDialog:
AlertDialog.Builder(Context context, int theme)
т
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), theme)
Ответ 2
Вы не используете конструктор AlertDialog.Builder(Context, int) с библиотекой поддержки, поскольку он доступен только с API 11.
Чтобы настроить тему в своем диалоговом окне, используйте вместо этого ContextThemeWrapper:
ContextThemeWrapper context = new ContextThemeWrapper(getActivity(), android.R.style.Theme_Holo_Dialog_NoActionBar);
AlertDialog.Builder builder = new AlertDialog.Builder(context);
Ответ 3
Я просто потерял много времени, но я наконец нашел способ сделать это целиком в xml.
В теме приложения диалоги на самом деле тематически раздельно. Итак, чтобы стилизовать все диалоговые окна с зелеными кнопками и зелеными подсказками EditText, вы должны сделать такой стиль:
<style name="DialogTheme" parent="@android:style/Theme.Holo.Light.Dialog">
<item name="android:buttonStyle">@style/button_green</item>
<item name="android:textColorHint">@color/green</item>
</style>
Затем добавьте эту тему в свою тему приложения как dialogTheme
<style name="MyTheme" parent="android:Theme.Holo.Light">
<item name="android:dialogTheme">@style/DialogTheme</item>
</style>
Большое спасибо тому, кто написал этот пост, чтобы показать мне путь к тому, что я искал!
Ответ 4
Вот более актуальный ответ, используя целевой SDK с 23 и мин SDK 14, этот код отлично работает для меня.
Основное изменение от кода в вопросе - установка темы в конструкторе, только переопределение onCreateDialog()
и использование класса AlertDialog из библиотеки поддержки v7.
Используя этот код, зеленые текстовые плоские (без полей) кнопки показаны в 4.4.4 в отличие от серых кнопок по умолчанию с границами.
import android.support.v7.app.AlertDialog;
import android.app.Dialog;
import android.support.v4.app.DialogFragment;
import android.content.DialogInterface;
import android.os.Bundle;
public class MyDialog extends DialogFragment {
String message;
public MyDialog(String m) {
message = m;
int style = DialogFragment.STYLE_NORMAL, theme = 0;
theme = android.R.style.Theme_Holo_Dialog_NoActionBar;
setStyle(style, theme);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(getActivity())
.setMessage(message)
.setPositiveButton("OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
((EnterPhoneNumberActivity)getActivity()).doPositiveClick();
}
}
)
.setNegativeButton("EDIT",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
((EnterPhoneNumberActivity)getActivity()).doNegativeClick();
}
}
)
.create();
}
}
Использование в AppCompatActivity:
String message = "test";
if (message != null) {
DialogFragment newFragment = new MyDialog(message);
newFragment.show(getSupportFragmentManager(), "dialog");
}
Ответ 5
проверьте эту ссылку
Для меня это решило проблему, расширив фрагмент AppCompatDialog вместо фрагмента диалога
Ответ 6
Вы должны написать эти коды в "onCreateView".
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
View view = inflater.inflate(R.layout.dialog_your_theme, container);
return view;
}