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

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

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

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

2回答

1233閲覧

android AlertDialogに関して layoutInflaterを使う場合と使わない場合の違いが分からない

old_dog

総合スコア51

Java

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2020/01/10 03:35

<質問>
AlertDialogを表示するコードを調べていると、LayoutInflaterを使うコードが紹介されています。でもLayoutInflaterを使わなくても、同じ見た目、同じ動きをするコードも作れます。LayoutInflaterを使う場合と使わない場合では、例えばセキュリティに影響するとか、不具合がでるとか、LayoutInflaterを使ったほうがいい理由や両方法の違いはあるのでしょうか?

<参考コード>
App/res/layout/dialog.xml

dialog

1<?xml version="1.0" encoding="utf-8"?> 2<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:orientation="vertical" android:layout_width="match_parent" 4 android:layout_height="match_parent"> 5 6 <TextView 7 android:layout_width="wrap_content" 8 android:layout_height="wrap_content" 9 android:text="Dialog1"/> 10</LinearLayout>

App/java/project/MainActivity.java

public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new MyDialog1().show(getSupportFragmentManager(),null); // new MyDialog2().show(getSupportFragmentManager(),null); } }

■ LayoutInflaterを使ってdialog.xmlをダイアログにインフレーとする場合
App/java/project/MyDialog1.java

public class MyDialog extends AppCompatDialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); LayoutInflater inflater = getActivity().getLayoutInflater(); builder .setView(inflater.inflate(R.layout.dialog,null)) .setPositiveButton("OK-1", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // Ok-1押下処理 } }); builder.setCancelable(false); return builder.create(); } }

■ LinearLayoutインスタンスを生成してダイアログを表示する場合
App/java/project/MyDialog2.java

public class MyDialog2 extends AppCompatDialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); LinearLayout linearLayout = new LinearLayout(getActivity()); TextView textView = new TextView(getActivity()); textView.setText("Dialog2"); linearLayout.addView(textView); builder .setView(linearLayout) .setPositiveButton("OK-2",new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // OK-2押下処理 } }); builder.setCancelable(false); return builder.create(); } }

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

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

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

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

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

guest

回答2

0

ベストアンサー

プログラムコードでレイアウトするメリット

プログラム実行中に制御できます。

レイアウトリソースでレイアウトするメリット

そもそもandroidに限らず、昨今のモダンなGUIフレームワーク(を使ったGUIプログラム)は、レイアウトコードと制御コードは分離するのが一般的です。

所詮XMLなどでデータ化できるようのものなのですから、プログラムコードよりもフォーマット化されたデータコードの方が見やすいと思います。

また、レイアウトデータをXMLなどのフォーマット化する事により、レイアウトデータ自体も扱いやすくなります。
AndroidStudioで言えば、あなたがLayoutEditorを自作するとしたら、XMLで書かれたレイアウトデータと、レイアウトが書かれたプログラムコード、どちらが扱いやすいですか?
あまり開発者側にメリットがないように聞こえますが、おかげで視覚的にレイアウトを編集できる、と言えば有り難みも増すのではないですか。

投稿2020/01/10 12:38

katsuko

総合スコア3469

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

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

old_dog

2020/01/11 02:35

ご丁寧なご解説をありがとうございました。今回はDialogFlagmentクラスでDialogを扱おうとしたのですが、xmlファイルを作成してDialogクラスからfindViewByIdでIdを取得できなかったので、DialogクラスでLayoutを生成してDialog表示を試みました。アドバイスの通り、プログラムとレイアウトを分けたほうが扱いやすいですし、メンテナンスもしやすいです。貴重なお時間をいただき、ご丁寧にアドバイス下さいましてありがとうございました。
guest

0

Java

1inflater.inflate(R.layout.dialog,null)

そのままsetViewに突っ込まれてますが、一旦変数に突っ込めば色々いじれます。
必要なければ直接LayoutIdを突っ込めばいいかと。

投稿2020/01/10 11:48

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

old_dog

2020/01/11 02:42

貴重なお時間にアドバイスをいただきまして心からお礼申し上げます。今回はMainActivityクラスではなく、AleartDialogFragmentクラスでDialogを表示させようとしており、DialogクラスからLayout.xmlをfind ViewByIdできなかったので、DialogクラスでLayoutを生成してDialogで表示させてます。なのでR.Layout.dialogというリソースIDがなくて、Inflateが使えずに、記載の処理となりました。リソースIDがなくてもInflateのような処理ができたらと検索をしてましたが、見当たらなくて断念しておりました。アドバイス、ありがとうございました。心からお礼申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問