46

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

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

他にやるべきことはありますか?互換性ライブラリを使用すると、Holoテーマなどが無効になりますか?この場合、2つのDialogFragmentsを作成する必要があります。1つは古いバージョン用で、もう1つは新しいバージョン用です。

ありがとう!


これが私のダイアログの(簡略化された)コードです。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();
    }
4

5 に答える 5

49

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);
于 2012-12-13T14:58:42.987 に答える
31

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

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

 AlertDialog.Builder(Context context, int theme)

すなわち

 AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), theme)
于 2012-05-18T13:55:44.533 に答える
22

私はこれで多くの時間を失いましたが、ついにこれを完全に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>

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

于 2014-06-23T22:27:46.930 に答える
2

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");
    }
于 2015-09-17T19:18:55.077 に答える
-4

これらのコードは「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;
}
于 2013-12-20T06:45:38.697 に答える