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

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

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

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

Android

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

Android Studio

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

Q&A

解決済

2回答

1371閲覧

Inflateさせたレイアウトのボタンのリスナーを定義できない

shoshinshadao

総合スコア6

Java

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

Android

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

Android Studio

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

0グッド

0クリップ

投稿2020/07/04 16:25

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

Android StudioでInflateさせたレイアウトでボタンのリスナーをオーバーライドするとアプリが正常に起動しません

エラーメッセージ

該当のソースコード

Button button2 = findViewById(R.id.button2); final TextView textView = findViewById(R.id.textView); button2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { textView.setText("嘘だよ"); } });

java

1 2package com.example.testdynamic; 3 4import androidx.appcompat.app.AppCompatActivity; 5import androidx.constraintlayout.widget.ConstraintLayout; 6 7import android.os.Bundle; 8import android.view.LayoutInflater; 9import android.view.View; 10import android.widget.Button; 11import android.widget.TextView; 12 13public class MainActivity extends AppCompatActivity { 14 15 @Override 16 protected void onCreate(Bundle savedInstanceState) { 17 super.onCreate(savedInstanceState); 18 setContentView(R.layout.activity_main); 19 20 final LayoutInflater inflater = (LayoutInflater)getLayoutInflater(); 21 final ConstraintLayout layout = (ConstraintLayout)findViewById(R.id.testDynamic); 22 Button button = findViewById(R.id.button); 23 button.setOnClickListener(new View.OnClickListener() { 24 @Override 25 public void onClick(View view) { 26 layout.removeAllViews(); 27 inflater.inflate(R.layout.dynamic, layout); 28 } 29 }); 30 31 Button button2 = findViewById(R.id.button2); 32 final TextView textView = findViewById(R.id.textView); 33 button2.setOnClickListener(new View.OnClickListener() { 34 @Override 35 public void onClick(View view) { 36 textView.setText("嘘だよ"); 37 } 38 }); 39 } 40}

試したこと

javaを勉強したてで稚拙なところがあったので、何もできませんでした。申し訳ございません。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

hoshi-takanori

2020/07/04 22:57 編集

testDynamic と button は activity_main.xml で作られて、button2 と textView は dynamic.xml で作られるってことでしょうか? また、エラーメッセージの見方は分かりますか?
退会済みユーザー

退会済みユーザー

2020/07/04 23:59

> (例)PHP(CakePHP)で●●なシステムを作っています。 質問は cakephp ですか android ですか?
shoshinshadao

2020/07/05 03:33

testDynamicとbuttonはactivity_main.xmlで作り、button2とtextViewはdynamic.xmlで作りました ちょっとデバッグってのやってみたんですけど、button2.onClicklistener()のところがon a null object referenceってなってました。
guest

回答2

0

ありがとうございますありがとうございます。ご親切に解説していただきありがとうございます。
おかげさまで無事正常に動作いたしました。ありがとうございます重ねてありがとうございます。

投稿2020/07/05 06:54

shoshinshadao

総合スコア6

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

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

0

ベストアンサー

まず、button.setOnClickListener の引数 new View.OnClickListener() { 〜 } は匿名クラスというやつで、button が押された時に onClick メソッドが実行されます。つまり、button が押されるまで dynamic.xml は読み込まれず、button2 や textView は存在しません。

java

1 button.setOnClickListener(new View.OnClickListener() { 2 @Override 3 public void onClick(View view) { 4 layout.removeAllViews(); 5 inflater.inflate(R.layout.dynamic, layout); 6 } 7 });

で、onCreate メソッドの中身ですが、実際に onCreate が呼ばれた時に実行される内容は、ボタンが押された時の処理を 〜 で省略すると、

java

1public class MainActivity extends AppCompatActivity { 2 3 @Override 4 protected void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 setContentView(R.layout.activity_main); 7 8 final LayoutInflater inflater = (LayoutInflater)getLayoutInflater(); 9 final ConstraintLayout layout = (ConstraintLayout)findViewById(R.id.testDynamic); 10 Button button = findViewById(R.id.button); 11 button.setOnClickListener(new View.OnClickListener() {}); 12 13 Button button2 = findViewById(R.id.button2); 14 final TextView textView = findViewById(R.id.textView); 15 button2.setOnClickListener(new View.OnClickListener() {}); 16 } 17}

となります。つまり、まだ生成されてない button2 や textView にアクセスしようとしてエラーになってます。

修正方法ですが、button2 や textView へのアクセスは dynamic.xml を読み込んだ後、つまり button の onClick で行う必要があります。

java

1public class MainActivity extends AppCompatActivity { 2 3 @Override 4 protected void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 setContentView(R.layout.activity_main); 7 8 final LayoutInflater inflater = (LayoutInflater)getLayoutInflater(); 9 final ConstraintLayout layout = (ConstraintLayout)findViewById(R.id.testDynamic); 10 Button button = findViewById(R.id.button); 11 button.setOnClickListener(new View.OnClickListener() { 12 @Override 13 public void onClick(View view) { 14 layout.removeAllViews(); 15 inflater.inflate(R.layout.dynamic, layout); 16 17 Button button2 = findViewById(R.id.button2); 18 final TextView textView = findViewById(R.id.textView); 19 button2.setOnClickListener(new View.OnClickListener() { 20 @Override 21 public void onClick(View view) { 22 textView.setText("嘘だよ"); 23 } 24 }); 25 } 26 }); 27 } 28}

投稿2020/07/05 04:57

編集2020/07/05 05:10
hoshi-takanori

総合スコア7901

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問