AlertDialog の幅を内容物に合わせて縮める

これを show() すると、

public class MyDialogFragment extends DialogFragment {
    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setMessage("hello");

        return builder.create();
    }
}

こうなる。

f:id:Ginkyo:20180315032902p:plain

AlertDialog の幅が内容物に対して広すぎるので、丁度良い大きさに縮めたい。

解決策

テーマを作る

<style name="AppTheme.DialogTheme" parent="Theme.AppCompat.Light.Dialog.Alert">
    <item name="android:windowMinWidthMajor">0%</item>
    <item name="android:windowMinWidthMinor">0%</item>
</style>

parent="Theme.AppCompat.Light.Dialog" にしても良い。

android:windowMinWidthMajor は横画面のとき、android:windowMinWidthMinor は縦画面のときに使われる。

名前空間android:」を忘れないように

項目の名前には android:windowMinWidth* を使うこと。android: を省いて name="windowMinWidth*" のように書くと機能しない。

リファレンスにもこう書いてあるよ。

注: それぞれの <item> 要素でプロパティの名前の前に、android: 名前空間を付けるのを忘れないようにしてください。 たとえば <item name="android:inputType"> のようにします。
Styles and Themes | Android Developers

AlertDialog.Builder のコンストラクタにテーマを渡す

public class MyDialogFragment extends DialogFragment {
    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.AppTheme_DialogTheme); // 第 2 引数でテーマを指定する
        builder.setMessage("hello");

        return builder.create();
    }
}

完了

f:id:Ginkyo:20180315040846p:plain