質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

2299閲覧

アラートダイアログのサイズを小さくしたい

aruko

総合スコア47

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2022/04/11 02:04

●実現したいこと 
下のようなダイアログのためのレイアウトを作りました。横幅も縦幅も小さいものです。これをアクティビティで表示したいです。ですが、これをアクティビティで表示させると横幅が大きい状態で表示されます。

java

1<?xml version="1.0" encoding="utf-8"?> 2<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:layout_width="wrap_content" 6 android:layout_height="wrap_content" 7 android:background="@color/white" 8 android:gravity="center" 9 android:orientation="vertical"> 10 <TextView 11 android:id="@+id/text" 12 android:layout_width="20dp" 13 android:layout_height="wrap_content" 14 android:layout_margin="10dp" 15 android:text="?" /> 16</LinearLayout>

●試したこと
ネットで色々調べて、ダイアログのサイズ変更を試しましたが、全く変わらず横幅が大きいままか、java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window android.app.Dialog.getWindow()' on a null object reference
というエラーが出るかで、横幅の小さいダイアログになりません。
DialogFragmentS1.javaでは、次のように試しましたが、エラーになります。

java

1AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 2LayoutInflater inflater=LayoutInflater.from(getActivity()); 3view=inflater.inflate(R.layout.dialog_custom_s1_2,null); 4builder.setView(view); 5 Dialog dialog = getDialog(); 6 WindowManager.LayoutParams lp = dialog.getWindow().getAttributes(); 7 DisplayMetrics metrics = getResources().getDisplayMetrics(); 8 9 // 画面サイズの 〇倍の大きさに指定 10 int dialogWidth = (int) (metrics.widthPixels * 0.1); 11 int dialogHeight = (int) (metrics.heightPixels * 0.05); 12 lp.width = dialogWidth; 13 lp.height = dialogHeight; 14 dialog.getWindow().setAttributes(lp); 15dialog = builder.create();

アクティビティでは、次のようなコードを入れて表示させています。

java

1 DialogFragment dialog = new DialogFragmentS1(); 2 dialog.show(getSupportFragmentManager(), "dialog_s1" + dialog_num_s1);

ご教授いただきたいです。よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

DialogFragmentでダイアログサイズを変更する のコードを参考にされたように見えますが、肝心な個所を用いられていないようです。

該当ロジックは DialogFragment の onActivityCreated をオーバーライドして書かれています。
まずは全く同じように書かれてみては如何でしょうか。


DialogFragment の getDialog は、 onCreateDialog が返したダイアログを返すと思いますので、 onCreateDialog 内で getDialog をするのは無理に思います。
また、 Dialog をビルダーで作成した直後は単なるデータの塊であり、 getWindow は有効な値を返さないようにも思います。
ですので、 Dialog が表示された時点で実行される OnShowListener をダイアログに登録してサイズ変更の処理をすると良いのではないでしょうか。
(この方法はダイアログのボタンの初期表示時の有効/無効を操作する場合にも利用できます。)

MainActivity.java

java

1import androidx.appcompat.app.AppCompatActivity; 2import androidx.fragment.app.DialogFragment; 3 4import android.os.Bundle; 5 6public class MainActivity extends AppCompatActivity { 7 8 @Override 9 protected void onCreate(Bundle savedInstanceState) { 10 super.onCreate(savedInstanceState); 11 setContentView(R.layout.activity_main); 12 13 DialogFragment dialog = new DialogFragmentS1(); 14 dialog.show(getSupportFragmentManager(), "dialog_s1"); 15 } 16}

(activity_main.xml はテンプレートそのままなので省略)

DialogFragmentS1.java

java

1import android.app.Dialog; 2 3import android.os.Bundle; 4import android.util.DisplayMetrics; 5import android.view.*; 6 7import androidx.annotation.*; 8import androidx.appcompat.app.AlertDialog; 9import androidx.fragment.app.*; 10 11public class DialogFragmentS1 extends DialogFragment { 12 @NonNull 13 @Override 14 public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { 15 AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 16 LayoutInflater inflater = LayoutInflater.from(getActivity()); 17 View view = inflater.inflate(R.layout.dialog_custom_s1_2,null); 18 builder.setView(view); 19 Dialog dialog = builder.create(); 20 21 dialog.setOnShowListener(d -> { 22 WindowManager.LayoutParams lp = dialog.getWindow().getAttributes(); 23 DisplayMetrics metrics = getResources().getDisplayMetrics(); 24 25 // 画面サイズの0.8倍の大きさに指定 26 int dialogWidth = (int) (metrics.widthPixels * 0.8); 27 int dialogHeight = (int) (metrics.heightPixels * 0.8); 28 lp.width = dialogWidth; 29 lp.height = dialogHeight; 30 dialog.getWindow().setAttributes(lp); 31 }); 32 33 return dialog; 34 } 35}

(dialog_custom_s1_2.xml はご質問でご提示されている状態にしたので省略)

dialog.setOnShowListener をしなかった場合
イメージ説明

dialog.setOnShowListener をした場合
イメージ説明

投稿2022/04/11 03:41

編集2022/04/11 06:36
jimbe

総合スコア12625

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aruko

2022/04/11 05:07

いつもアドバイスありがとうございます。 public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); をDialogFragmentS1.javaに入れてみました。これをアクティビティからどのように使用すればいいのでしょうか。 アクティビティでは、何も書き加えない状態で実行しましたが、大きいダイアログのままでした。 教えていただけるとありがたいです。
aruko

2022/04/12 10:50

あぁ~できたぁ。 小さなかわいい”?”ダイアログを出すことができました。 OnShowListenerは初めて使います。まだ理解が十分ではないですが、OnShowListenerというものがあるということ、覚えていきたいと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問