🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

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

Android Studio

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

Q&A

解決済

2回答

3041閲覧

AndroidStudio 継承した別クラスを追加するとアプリが落ちる

mknji

総合スコア19

Java

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

Android Studio

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

0グッド

0クリップ

投稿2019/09/15 15:18

編集2019/09/16 06:13

以下のアプリを実行し、Buttonを押す(OnClickを呼ぶ)とクラッシュします。

MainActivity.java

Java

1package com.example.project1; 2 3import androidx.appcompat.app.AppCompatActivity; 4 5import android.net.Uri; 6import android.os.Bundle; 7import android.view.View; 8import android.widget.Button; 9import android.widget.TextView; 10import android.content.Intent; 11 12public class MainActivity extends AppCompatActivity { 13 14 private Button button; 15 private TextView textView; 16 17 18 @Override 19 protected void onCreate(Bundle savedInstanceState) { 20 super.onCreate(savedInstanceState); 21 setContentView(R.layout.activity_main); 22 23 button = (Button)findViewById(R.id.button); 24 25 button.setOnClickListener(new View.OnClickListener(){ 26 @Override 27 public void onClick(View view){ 28 URLRequest urlRequest = new URLRequest(); 29 //テキストボックスから取得 30 31 String BoxID = urlRequest.getstring(R.id.BoxIDText); 32 String Name = urlRequest.getstring(R.id.NameBoxText); 33 String Tags = urlRequest.getstring(R.id.TagsBoxText); 34 String Status = urlRequest.getstring(R.id.StatusBoxText); 35 36 } 37 }); 38 } 39} 40

継承したURLRequest .java

Java

1package com.example.project1; 2import android.widget.EditText; 3 4public class URLRequest extends MainActivity { 5 protected EditText editText; 6 7 public String getstring(int id){ 8 editText = findViewById(id); 9 String parameter = editText.getText().toString(); // 10 editText.setText(""); //テキストをクリア 11 return parameter; 12 } 13}

activity_main.xml

XML

1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout 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="match_parent" 6 android:layout_height="match_parent" 7 tools:context=".MainActivity"> 8 9 <LinearLayout 10 android:layout_width="match_parent" 11 android:layout_height="match_parent" 12 android:orientation="vertical" 13 tools:layout_editor_absoluteX="-34dp" 14 tools:layout_editor_absoluteY="16dp"> 15 16 <TextView 17 android:id="@+id/BoxID" 18 android:layout_width="match_parent" 19 android:layout_height="wrap_content" 20 android:text="BoxID" /> 21 22 <EditText 23 android:id="@+id/BoxIDText" 24 android:layout_width="match_parent" 25 android:layout_height="wrap_content" 26 android:ems="10" 27 android:inputType="textPersonName" 28 android:text="Name" /> 29 30 <TextView 31 android:id="@+id/Name" 32 android:layout_width="match_parent" 33 android:layout_height="wrap_content" 34 android:text="Productname" /> 35 36 <EditText 37 android:id="@+id/NameBoxText" 38 android:layout_width="match_parent" 39 android:layout_height="wrap_content" 40 android:ems="10" 41 android:inputType="textPersonName" 42 android:text="Name" /> 43 44 <TextView 45 android:id="@+id/Tags" 46 android:layout_width="match_parent" 47 android:layout_height="wrap_content" 48 android:text="Tags" /> 49 50 <EditText 51 android:id="@+id/TagsBoxText" 52 android:layout_width="match_parent" 53 android:layout_height="wrap_content" 54 android:ems="10" 55 android:inputType="textPersonName" 56 android:text="Name" /> 57 58 <TextView 59 android:id="@+id/Status" 60 android:layout_width="match_parent" 61 android:layout_height="wrap_content" 62 android:text="Status" /> 63 64 <EditText 65 android:id="@+id/StatusBoxText" 66 android:layout_width="match_parent" 67 android:layout_height="wrap_content" 68 android:ems="10" 69 android:inputType="textPersonName" 70 android:text="Name" /> 71 72 <Button 73 android:id="@+id/button" 74 android:layout_width="match_parent" 75 android:layout_height="wrap_content" 76 android:text="Send" /> 77 </LinearLayout> 78 79</androidx.constraintlayout.widget.ConstraintLayout>

原因として考えらえること

もともとは一つのクラス(MainActivity)の中にすべてコードを書いていましたが、見た目が悪いので継承させたURLRequest クラスを追加しました。
追加したところ、アプリがクラッシュするようになったのでおそらくそこが原因として考えられます。
もう3時間近く悩んでいて、調べても全くわかりません。
だいぶ丸投げですが、何が間違っているのかさえ分かりません。どなたか教えてください。

ツール

JDK8
Android3.5
です

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

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

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

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

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

guest

回答2

0

自己解決

ご回答をもとに自己解決させていただきました。
別クラス内でfindViewById();させるのではなく、画面クラス(MainActivity)で処理して引数で渡すことにしました
解決すると案外単純でしたが、一度わからなくなると周りが見えなくなるようです。

別クラスでMainActivityのアクティビティをいじる方法を調べるかまた質問させていただきます。
ありがとうございました。

MainActivity,java

Java

1package com.example.project1; 2 3import androidx.appcompat.app.AppCompatActivity; 4import android.net.Uri; 5import android.os.Bundle; 6import android.view.View; 7import android.widget.Button; 8import android.widget.EditText; 9import android.widget.TextView; 10import android.content.Intent; 11 12public class MainActivity extends AppCompatActivity { 13 14 private Button button; 15 private TextView textView; 16 17 @Override 18 protected void onCreate(Bundle savedInstanceState) { 19 super.onCreate(savedInstanceState); 20 setContentView(R.layout.activity_main); 21 22 button = findViewById(R.id.button); 23 24 button.setOnClickListener(new View.OnClickListener(){ 25 @Override 26 public void onClick(View view){ 27 URLRequest urlRequest = new URLRequest(); 28 29 //テキストボックスから取得 30 String BoxID = urlRequest.getstring((EditText)findViewById(R.id.BoxIDText)); 31 String Name = urlRequest.getstring((EditText)findViewById(R.id.NameBoxText)); 32 String Tags = urlRequest.getstring((EditText)findViewById(R.id.TagsBoxText)); 33 String Status = urlRequest.getstring((EditText)findViewById(R.id.StatusBoxText)); 34 35 } 36} 37

URLRequest.java

Java

1package com.example.project1; 2 3import android.widget.EditText; 4 5public class URLRequest extends MainActivity { 6 public String getstring(EditText editText){ 7 String parameter =editText.getText().toString(); // 8 editText.setText(""); //テキストをクリア 9 return parameter; 10 } 11} 12

投稿2019/09/16 06:08

編集2019/09/16 06:10
mknji

総合スコア19

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

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

0

まず, デバック環境を整えてください.
整えられた開発環境であれば, アプリで起きたことをログとして確認できるはずです.

問題のコードですが

public class URLRequest extends MainActivity { : }
URLRequest urlRequest = new URLRequest();

としても URLRequest 内で findViewById は動作しません.
アクティビティは, システムによって生成されたものでなければならないとお考えください.

投稿2019/09/15 15:34

jimbe

総合スコア13204

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

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

mknji

2019/09/16 01:54

ご回答ありがとうございます。 おそらくこれがアプリのログでしょうか。 java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference おっしゃる通り継承してもアクティビティは継承されないので、 setContentView(R.layout.activity_main); をURLRequest(継承クラス)のほうへ追加しました。が、 E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.project1, PID: 8560 java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference at androidx.appcompat.app.AppCompatDelegateImpl.<init>(AppCompatDelegateImpl.java:249) at androidx.appcompat.app.AppCompatDelegate.create(AppCompatDelegate.java:182) at androidx.appcompat.app.AppCompatActivity.getDelegate(AppCompatActivity.java:520) at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:140) at com.example.project1.URLRequest.setActivity(URLRequest.java:15) at com.example.project1.MainActivity$1.onClick(MainActivity.java:29) at android.view.View.performClick(View.java:6597) at android.view.View.performClickInternal(View.java:6574) at android.view.View.access$3100(View.java:778) at android.view.View$PerformClick.run(View.java:25885) at android.os.Handler.handleCallback(Handler.java:873) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:6669) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) と出てしまい、また落ちました。もうどうすればいいかわかりません。 結局クラスを分けないほうが良いのでしょうか
jimbe

2019/09/16 07:56

ログとしては分かり難いですが, Activity のメソッドを使用する箇所の内部奥深くで, アクティビティがシステムによって生成されたものでは無いことで NullPointerException が発生しているものと考えられます. ログにある > at com.example.project1.URLRequest.setActivity(URLRequest.java:15) > at com.example.project1.MainActivity$1.onClick(MainActivity.java:29) の辺りでそれらを行っていたのではないでしょうか. クラス分けですが, 件の場合はアクティビティの使い方を間違ってしまわれただけで, クラス分けの是非とは関係ありません. ただ, URLRequest の役割がご提示のコードの処理だけであれば, 分ける意味は殆ど無いと思います. (クラス名から処理内容が想像できるとは言い難いですし...)
mknji

2019/11/05 11:37

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問