携帯電話をAndroid 6.0に更新しました。ダイアログに次の2つの問題があります。
1)タイトルは表示されますが、メッセージはアラートダイアログ用ではありません(解決済み):
new AlertDialog.Builder(context).setTitle("Title").setMessage("Message");
2)カスタムダイアログフラグメントのタイトルも表示されません(解決されません):
getDialog().setTitle("Title");
Lollipopや古いバージョンではこのような問題はありませんでした。この問題は、携帯電話をMarshmallowにアップデートした後にのみ現れました。
問題を解決する方法は?
Lollipop以降のテーマでコンストラクタを使用するAndroidバージョン:
ダークテーマ
AlertDialog.Builder builder;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
builder = new AlertDialog.Builder(context, Android.R.style.Theme_Material_Dialog_Alert);
} else {
builder = new AlertDialog.Builder(context);
}
そしてLightテーマ
AlertDialog.Builder builder;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
builder = new AlertDialog.Builder(context, Android.R.style.Theme_Material_Light_Dialog_Alert);
} else {
builder = new AlertDialog.Builder(context);
}
アプリのテーマで以下を使用する必要があるという回答がいくつかあります。
<item name="Android:alertDialogTheme">@style/Theme.AppCompat.Light.Dialog.Alert</item>
それは正しいですが、私にとってはすべての場所で機能していませんでした。最終的に、私はいくつかの場所で通常のAlertDialog Builderを使用し、他の場所ではサポートビルダーを使用していることに気付きました。サポートAlertDialogを使用している場合は、テーマに以下も含めるようにしてください。
<item name="alertDialogTheme">@style/Theme.AppCompat.Light.Dialog.Alert</item>
これをベーステーマスタイルタグ内のスタイルファイルに配置するだけで、準備完了です
<item name="Android:alertDialogTheme">@style/Theme.AppCompat.Light.Dialog.Alert</item>
_2)
_に対する回答、setStyle()
でtheme
が使用されているため、onCreateDialog()
の前にonCreateDialog()
を呼び出す必要があります
_@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
setStyle(STYLE_NORMAL, Android.R.style.Theme_Material_Light_Dialog_Alert);
}
Dialog dialog = super.onCreateDialog(savedInstanceState);
dialog.setTitle(R.string.dialog_title);
return dialog;
}
_
私は自分のスタイルを作ることでこの問題を解決しようとしました。
ダイアログオブジェクトは次のようになり、このダイアログを指すスタイルは以下のようになります
new AlertDialog.Builder(new ContextThemeWrapper(Context, R.style.Dialog))
.setTitle("Title")
.setMessage("Sample Message ...").show();
R.style.Dialog ::
<style name="Dialog">
<item name="Android:textColorPrimary">@color/primary_text</item>
<item name="Android:textColor">@color/primary_color</item>
</style>
色::
<color name="primary_text">#212121</color>
<color name="primary_color">#2196f3</color>
最後に、出力は次のようになります
注:「Android:textColorPrimary」はダイアログsetMessageに、「Android:textColor」はダイアログsetTitleに使用されます。ダイアログオブジェクトでsetPositiveとsetNegativeのボタンとリスナーを使用していませんが、独自のダイアログオブジェクトを作成したい場合は、図でそれらを見ることができます。
new AlertDialog.Builder(context)
.setTitle("Delete entry")
.setMessage("Are you sure you want to delete this entry?")
.setPositiveButton(Android.R.string.yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// continue with delete
}
})
.setNegativeButton(Android.R.string.no, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// do nothing
}
})
.setIcon(Android.R.drawable.ic_dialog_alert)
.show();
これがあなたを助けることを願っています............
私はあなたが白い背景に白いテキストを表示していると思われます! (スクリーンショットを見ると、(i)アイコンもうまく表示されておらず、白以外の背景に表示されるように設計されていることを示唆しています。
コンストラクターpublic AlertDialog.Builder (Context context, int themeResId)
を使用して、ダイアログをスタイルするために特定のテーマを使用していることを確認できます。Theme_Material_Dialog
はおそらく必要なものです。
あなたのメインテキストの色はダイアログの背景色と同じかもしれません。その場合、styles.xmlで使用します(ほんの一例です):
<style name="AlertDialog" parent="@Android:style/Theme.Material.Light.Dialog.Alert">
<item name="Android:textColor">#000000</item>
</style>
およびダイアログ作成で:
new AlertDialog.Builder(
new ContextThemeWrapper(getContext(), R.style.AlertDialog))
).setMessage("test");
DialogFragment
を使用する場合、次のことが必要です。
スタイルを追加
<style name="CustomDialog" parent="@style/Theme.AppCompat.Light.Dialog">
<item name="Android:windowNoTitle">false</item>
</style>
DialogFragment
にgetTheme
を追加します
public class CustomDialogFragment extends DialogFragment{
public int getTheme() {
return R.style.CustomDialogFragment;
}
.
.
.
以上です!
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Use the Builder class for convenient dialog construction
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setMessage(R.string.dialog_fire_missiles)
.setPositiveButton(R.string.fire, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// FIRE ZE MISSILES!
}
})
.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// User cancelled the dialog
}
});
// Create the AlertDialog object and return it
return builder.create();
}
この希望を確認したら、これが機能するようになります.......
私の場合、すべてのダイアログはフォントと同じ色でした(タイトルとメッセージ)。この状態を修正するために行ったのは、テーマの色属性の変更です。 xmlテーマファイルを「res/values-v22」にコピーし、マシュマロに異なる色を設定しました。
<resources>
<style name="LywCompatTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
<item name="Android:textColorPrimary">@Android:color/tertiary_text_dark</item>
</style>
</resources>
またはダイアログのみ
<resources>
<style name="LywCompatTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
<item name="Android:alertDialogTheme">@style/LywAlertDialogStyle</item>
</style>
<style name="LywAlertDialogStyle" parent="Base.Theme.AppCompat.Light.Dialog.Alert">
<item name="Android:textColorPrimary">@color/lyw_secondary_text_color</item>
</style>
</resources>