Подтвердить что ты не робот

Тема не применяется к 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();
    }
4b9b3361

Ответ 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;
}