2013年10月23日水曜日

AppCompat は Dialog をサポートしていない

AppCompat には Dialog 系のテーマがありません。

AppCompat で用意されているテーマ
  • Theme.AppCompat
  • Theme.AppCompat.Light
  • Theme.AppCompat.Light.DarkActionBar


次のように自分でダイアログのテーマを作ることはできます。
android:windowBackground に指定する画像(下記だと @drawable/dialog_full_holo_light)を platform から取ってこないといけないですが。 <resources xmlns:android="http://schemas.android.com/apk/res/android"> <style name="AppBaseTheme" parent="Theme.AppCompat.Light"></style> <style name="AppTheme" parent="AppBaseTheme"> <item name="android:windowBackground">@drawable/bg</item> </style> <style name="AppTheme.Dialog"> <item name="android:windowFrame">@null</item> <item name="android:windowBackground">@drawable/dialog_full_holo_light</item> <item name="android:windowIsFloating">true</item> <item name="android:windowContentOverlay">@null</item> <item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item> <item name="android:windowActionBar">false</item> <item name="android:windowNoTitle">true</item> <item name="android:windowActionModeOverlay">true</item> <item name="android:windowCloseOnTouchOutside">false</item> </style> </resources> ただし、 <item name="android:windowActionBar">true</item> <item name="android:windowNoTitle">false</item> とすると、IllegalStateException が発生します。 java.lang.IllegalStateException: ActionBarImpl can only be used with a compatible window decor layout つまり、Dialog で AppCompat の ActionBar は利用できないようになっている、ということです。


なので、View で実装した DialogFragment を用意することになるのかな。 public class SimpleDialogFragment extends DialogFragment { public static SimpleDialogFragment getInstance(String title, String message) { Bundle args = new Bundle(); args.putString("title", title); args.putString("message", message); SimpleDialogFragment f = new SimpleDialogFragment(); f.setArguments(args); return f; } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { Bundle args = getArguments(); String title = args.getString("title"); String message = args.getString("message"); View view = LayoutInflater.from(getActivity()) .inflate(R.layout.fragment_dialog, null); TextView tv; // title tv = (TextView) view.findViewById(R.id.title); tv.setText(title); // message tv = (TextView) view.findViewById(R.id.message); tv.setText(message); Dialog dialog = new Dialog(getActivity(), R.style.AppTheme_Dialog); dialog.setContentView(view); return dialog; } } <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/title" style="?attr/actionBarStyle" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:gravity="center_vertical" android:paddingLeft="16dp" android:paddingRight="16dp" android:textAppearance="?android:attr/textAppearanceMedium" /> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/message" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="16dip" android:autoLink="web|email" android:linksClickable="true" /> </ScrollView> </LinearLayout>



# ちなみに ActionBar Sherlock は Dialog サポートしてます

1 件のコメント:

  1. Actionbar Sherlockも4.3.0でダイアログのテーマを廃止したようです。。見当違いのことをいっていたらすみません、、
    https://github.com/JakeWharton/ActionBarSherlock/commit/601bde214b56b8fad0b4fc5aaed5af0b531b6135

    返信削除