web-dev-qa-db-ja.com

テーマはAndroidのDialogFragmentに適用されません

古いDialogsをDialogFragmentに切り替えていますが、テーマとスタイルが機能していないようです。

互換性ライブラリv4のDialogFragmentを使用しており、onCreateメソッドでsetStyle(style、theme)を呼び出してみました。さまざまなテーマがありますが、ダイアログはAndroid 4.0.3を実行しているエミュレーターでは常に「古い」ダイアログとして表示されます(つまり、Holoテーマでは表示されません)。

他に何かすべきことはありますか?互換性ライブラリを使用すると、Holoテーマなどが無効になりますか?この場合、古いバージョン用と新しいバージョン用の2つの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();
    }
43
LuTHieR

テーマはフラグメントではなく実際のダイアログに設定する必要があると思います

このコンストラクターを使用して、AlertDialogを作成します。

 AlertDialog.Builder(Context context, int theme)

すなわち

 AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), theme)
29
Blundell

API 11以降でしか使用できないため、AlertDialog.Builder(Context、int)コンストラクターをサポートライブラリで使用しないでください。

ダイアログにテーマを設定するには、代わりに次のようなContextThemeWrapperを使用します。

ContextThemeWrapper context = new ContextThemeWrapper(getActivity(), Android.R.style.Theme_Holo_Dialog_NoActionBar);
AlertDialog.Builder builder = new AlertDialog.Builder(context);
48
Florian

私はこれに多くの時間を失いましたが、ついにこれをXMLで完全に行う方法を見つけました。

アプリケーションテーマでは、ダイアログは実際には個別にテーマが設定されています。したがって、すべてのDialogFragmentsに緑色のボタンと緑色の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>

私が探していたものへの道を示してくれた この投稿 を書いた人に感謝します!

18
pumpkinpie65

ここに、23のターゲットSDKと14の最小SDKを使用した、より最新の答えがあります。このコードは私にとって完璧に機能します。

質問のコードからの主な変更点は、コンストラクターでテーマを設定し、onCreateDialog()のみをオーバーライドし、v7サポートライブラリのAlertDialogクラスを使用することです。

このコードを使用すると、デフォルトの灰色のボーダー付きボタンとは対照的に、緑色のテキストフラット(ボーダーレス)ボタンが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");
    }
2
Daniel Nugent