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

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

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

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

Android

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

Q&A

解決済

2回答

2405閲覧

AlertDialogの引数がthisである理由

RunningReo

総合スコア6

Java

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

Android

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

0グッド

0クリップ

投稿2020/10/13 01:51

現在、サンプルコードを基にして、クイズアプリを作成しています。

その際に、ダイアログを実装しようとしているのですが、ダイアログ作成時に引数thisをもつコードがあります。

この意味が調べても分からないので質問させたいただきました。

一応、自分自身のthisの理解としましては、「コンストラクタを呼び出すもの」という認識でいます。

ご教授の程よろしくお願い致します。

こちらが、コードとなります。

public void checkAnswer(View view) {

Button answerBtn = findViewById(view.getId()); String answerText = answerBtn.getText().toString(); String notice; if (answerText.equals(rightAnswer)) { notice = "正解です"; Continuous++; rightCount++; if(Continuous > 1) { notice = Continuous + "連続正解"; } }else{ notice = "不正解……"; Continuous = 0; }

AlertDialog.Builder Notice = new AlertDialog.Builder(this);
Notice.setTitle(notice);
Notice.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
if (quizCount == QuizCount) {

Intent journey = new Intent(getApplicationContext(),resultActivity.class); journey.putExtra("RIGHT_ANSWER_COUNT",rightCount); startActivity(journey); }else{ quizCount++; showQuiz2(); } } }); Notice.setCancelable(false); Notice.show(); }

}

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

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

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

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

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

guest

回答2

0

ベストアンサー

自分自身のthisの理解としましては、「コンストラクタを呼び出すもの」という認識でいます。

これは認識が少し足りないかもしれません。間違いでもないですが、コンストラクタ内で別のシグネチャのコンストラクタを呼び出すようなケースを指しているのでしょうか。Javaにおけるthisとはコード上で多くの場合、今現在のインスタンスすなわち自分自身を指します。

Androidのダイアログ、例えばAlertDialogクラスのコンストラクタは、以下の形式です。。
AlertDialog - Android Developers

AlertDialog (Context context)です。AlertDialogのコンストラクタの引数として、Context型のインスタンスを必要とします。ご提示のコード、checkAnswer()メソッドは恐らく自作のアクティビティ(Activity)のメソッドのひとつだと推察しますが、アクティビティのクラスは、以下のような構造です。

AlertDialog - Android Developers

クラス階層をみると分かりますが、java.lang.Object <- android.content.Context <-- 色々... <- android.app.Activityのようにandroid.cotent.Contextを継承しています。
そのため、アクティビティのthisを例えばAlertDialogのコンストラクタに引き渡すことができる、というわけです。

「ではContextとは何なの?」と言う疑問がわいてくるかもしれませんが、この場合は「今、画面上で操作している対象、つまりアクティビティ、それをより抽象的に言ってコンテキスト(=文脈)」と考えておけば良いでしょうか。「Android getContext」などとキーワード指定して検索すると、より詳細な情報を得られると思います。

AlertDialogではそのコンストラクタにアクティビティのthisを渡すことにより、そのAlertDialogがそのコンテキスト上で動作する為の必要な結び付け処理を行っているのだということになります。

投稿2020/10/13 02:43

編集2020/10/13 02:52
dodox86

総合スコア9183

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

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

RunningReo

2020/10/13 05:23

ご回答ありがとうございます。 Acitivityの継承もとにContextがあるのは、知らなかったです。 Contextを継承していることで、thisが自分自身のAcitivityを指定可能であるという解釈でよろしいでしょうか?
dodox86

2020/10/13 05:31

> Contextを継承していることで、thisが自分自身のAcitivityを指定可能であるという解釈でよろしいでしょうか? そうですね。Javaのオブジェクト指向、継承を学ぶと分かりますが、ContextのサブクラスであるActivity、実際には更にそれを継承した自作のActivityのthisはそのスーパークラスのContextをも含むので、指定することができます。いずれ継承に伴う「ポリモフィズム」を理解する上でも重要になってくると思います。
RunningReo

2020/10/13 06:41

ご回答ありがとうございます。 ポリモフィズムは、まだ学んでいないのでそちらと併せてオブジェクト指向の理解を深めていこうと思いました。
guest

0

おそらくActivityからAlertDialogを呼び出しているからかと思います。
thisは自身になります。

AlertDialog.Builder の引数はContextになります。
なのでFragmentや、Viewから呼び出す場合は、contextを引数に渡します。

this = Activity をなぜ渡すのか。
Activityのコードを追っていくとわかるのですが、Activity自身がContextを継承したものになるからです。
そのため、Activityから呼び出す場合、Activityと一緒の状態で動いて欲しいため、自信を渡すということになります。

一応ですが、applicationContextを引数に渡してビルドすることも可能です。

投稿2020/10/13 02:18

編集2020/10/13 02:20
pg0084

総合スコア100

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

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

RunningReo

2020/10/13 05:25 編集

ご回答ありがとうございました!とても、分かりやすかったです! thisによって、アクティビティ内でダイアログを呼び出しているので、自分自身をしているのですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問