回答編集履歴

1

追加

2022/04/11 06:36

投稿

jimbe
jimbe

スコア12659

test CHANGED
@@ -2,3 +2,77 @@
2
2
 
3
3
  該当ロジックは DialogFragment の onActivityCreated をオーバーライドして書かれています。
4
4
  まずは全く同じように書かれてみては如何でしょうか。
5
+
6
+ ---
7
+
8
+ DialogFragment の getDialog は、 onCreateDialog が返したダイアログを返すと思いますので、 onCreateDialog 内で getDialog をするのは無理に思います。
9
+ また、 Dialog をビルダーで作成した直後は単なるデータの塊であり、 getWindow は有効な値を返さないようにも思います。
10
+ ですので、 Dialog が表示された時点で実行される OnShowListener をダイアログに登録してサイズ変更の処理をすると良いのではないでしょうか。
11
+ (この方法はダイアログのボタンの初期表示時の有効/無効を操作する場合にも利用できます。)
12
+
13
+ MainActivity.java
14
+ ```java
15
+ import androidx.appcompat.app.AppCompatActivity;
16
+ import androidx.fragment.app.DialogFragment;
17
+
18
+ import android.os.Bundle;
19
+
20
+ public class MainActivity extends AppCompatActivity {
21
+
22
+ @Override
23
+ protected void onCreate(Bundle savedInstanceState) {
24
+ super.onCreate(savedInstanceState);
25
+ setContentView(R.layout.activity_main);
26
+
27
+ DialogFragment dialog = new DialogFragmentS1();
28
+ dialog.show(getSupportFragmentManager(), "dialog_s1");
29
+ }
30
+ }
31
+ ```
32
+ (activity_main.xml はテンプレートそのままなので省略)
33
+
34
+ DialogFragmentS1.java
35
+ ```java
36
+ import android.app.Dialog;
37
+
38
+ import android.os.Bundle;
39
+ import android.util.DisplayMetrics;
40
+ import android.view.*;
41
+
42
+ import androidx.annotation.*;
43
+ import androidx.appcompat.app.AlertDialog;
44
+ import androidx.fragment.app.*;
45
+
46
+ public class DialogFragmentS1 extends DialogFragment {
47
+ @NonNull
48
+ @Override
49
+ public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
50
+ AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
51
+ LayoutInflater inflater = LayoutInflater.from(getActivity());
52
+ View view = inflater.inflate(R.layout.dialog_custom_s1_2,null);
53
+ builder.setView(view);
54
+ Dialog dialog = builder.create();
55
+
56
+ dialog.setOnShowListener(d -> {
57
+ WindowManager.LayoutParams lp = dialog.getWindow().getAttributes();
58
+ DisplayMetrics metrics = getResources().getDisplayMetrics();
59
+
60
+ // 画面サイズの0.8倍の大きさに指定
61
+ int dialogWidth = (int) (metrics.widthPixels * 0.8);
62
+ int dialogHeight = (int) (metrics.heightPixels * 0.8);
63
+ lp.width = dialogWidth;
64
+ lp.height = dialogHeight;
65
+ dialog.getWindow().setAttributes(lp);
66
+ });
67
+
68
+ return dialog;
69
+ }
70
+ }
71
+ ```
72
+ (dialog_custom_s1_2.xml はご質問でご提示されている状態にしたので省略)
73
+
74
+ dialog.setOnShowListener をしなかった場合
75
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-04-11/be46094a-b28e-4dff-b209-100d43e2cd8e.png)
76
+
77
+ dialog.setOnShowListener をした場合
78
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-04-11/f3a524e8-1bc2-4597-be72-1eac70c60d06.png)