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

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

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

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

Android

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

Android Studio

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

Q&A

解決済

2回答

4815閲覧

違うクラスでボタンの処理を書く

syosinsya12

総合スコア69

Java

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

Android

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

Android Studio

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

0グッド

0クリップ

投稿2016/08/16 07:44

編集2016/08/16 17:29

Activityの親クラスではないクラスでボタンタップ時の処理を書きたいです。
下のように書いてみたのですが

i1.setOnClickListener( new com.example.sample.name.ann.A(this));の()内でエラーメッセージが表示されてしまいます。
setOnClickListener(android.view.View.OnClickListner)in View cannot be applied to(com.example.sample.name.ann.A)というメッセージです。
どのように解決すればいいですか?

public class A extends AppCompatActivity { public final static String BOR = "com.example..name.BOR"; } public void get_i1 (){ double bor = 19.2; Intent intent = new Intent(this,Input.class); intent.putExtra(BOR,bor); startActivity(intent); } }
public class I extends AppCompatActivity { public A a = new A (); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(com.example.sample.name.R.layout.activity_i); } public void get_i1 (View view){ a.get_i1(); } }

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

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

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

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

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

guest

回答2

0

View cannot be applied to(com.example.sample.name.ann.A)

元ネタのサイトには

Contextというのはアプリの環境情報のようなもので、Activityの親クラスです。

ですから、Activityではthisを指定すれあなたよかったのですが、クラスが違うので、
Activityからcontextを教えてもらわなければなりません。

とありますが、
public class A extends AppCompatActivity
にはコンストラクタが無いのでContextを送れない

public A a = new A ();

もビルドエラーにもならなくなっている
しかし、問題があるので実行時に落ちたということでしょう

元ネタでは
btn.setOnClickListener( new ButtonClickListener(this) );
とthisをcontextとして送っています。
(このthisがいいかどうかは異論あるかもしれませんが)

投稿2016/08/17 01:14

aja

総合スコア3733

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

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

syosinsya12

2016/08/17 03:38

public A a = new A ();の問題というのはどうやって判断すればよいのでしょうか?
aja

2016/08/17 06:28

元ネタの btn.setOnClickListener( new ButtonClickListener(this) ); は、こう分解できるので ButtonClickListener b = new ButtonClickListener(this); btn.setOnClickListener( b ); これと同じようにやるということです public A a = ...  Javaの基本をもう一度やり直しましょう http://www.javadrive.jp/start/about/index2.html
syosinsya12

2016/08/17 11:19

なるほど、なんとなく理解できた気がします。 onclicklistenerはAPIでそのような処理が可能になるコードが既に存在しているということですか?
guest

0

ベストアンサー

いきなりこんなわけわからんコードを書くくらいなら、入門レベルの本を読んでサンプルコードを読むなり書くなりするべきです。それくらいトンチンカンなことをしていますよ。


別クラスに分けるというのであれば、次のような形になるかと。

java

1public class A { //Activityの継承は不要、むしろいらぬトラブルの原因 2 3 public final static String BOR = "com.example..name.BOR"; 4 5 } 6 public void get_i1 (Context context){ //引数としてContextを準備(Intentに渡すためのもの) 7 double bor = 19.2; 8 Intent intent = new Intent(context,Input.class); 9 intent.putExtra(BOR,bor); 10 context.startActivity(intent); 11 } 12}

java

1public class I extends AppCompatActivity { 2 3 public A a = new A(); 4 5 @Override 6 protected void onCreate(Bundle savedInstanceState) { 7 super.onCreate(savedInstanceState); 8 setContentView(com.example.sample.name.R.layout.activity_i); 9 } 10 public void get_i1 (View view){ 11 a.get_i1(getApplicationContext()); //get_i1にContextを渡して起動 12 } 13}

投稿2016/08/16 11:27

編集2016/08/18 14:48
swordone

総合スコア20651

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

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

swordone

2016/08/16 12:06 編集

よっく見比べて下さい。似ても似つきませんから。 あとこんな不親切なサイトを参考にするよりは、きちんと本を買って勉強したほうがいいです。
syosinsya12

2016/08/16 12:38

本での勉強も並行してしているのですが実際に触れながらの方が理解が深まるので、、、 ボタンをタップしたときの処理を一つのクラスにまとめる方法を教えていただけたら助かります。
swordone

2016/08/16 12:42

そもそもそのサイトで implements OnClickListener としているところを勝手に extends AppCompatActivity にしていて、「よく見比べろ」と言っているのにそれを放置している時点で、「あ、この人話聞く気ないんだな」と判断しますよ。
syosinsya12

2016/08/16 16:58

すみません。自分のコードに付け加えようという意識ばかりで、インターフェースのことなど考えていませんでした、、、 見てみたらその通りでしたね。 今本で勉強してみて、方法が理解できたので試してみたいと思います。
syosinsya12

2016/08/16 17:31

単純にボタンが押されたときにAのget_a1メソッドを呼び出すというコードを書いてみたのですが、エラーは出ていないのですがボタンを押したタイミングで強制終了してしまいます。どこか間違っていますか?
swordone

2016/08/17 00:02

話は聞かない、エラーの内容も載せない、そんなのでは誰も答えませんよ。
syosinsya12

2016/08/17 03:37

エラーメッセージなどは表示されず、エミュレータでボタンを押した際に強制終了してしまうのですが、エラーの内容というのはどうやって確認すればよいのでしょうか?
swordone

2016/08/17 03:48

ログはLogcatというものがありませんか? というか、なんでそのサンプルそのまま書こうとしないのかが不思議です。
syosinsya12

2016/08/17 04:12

おっしゃる通り基礎を勉強しなおした結果、単純にこの方法でできるのではないかと思ったので試してみたのですが強制終了する結果となってしまいました。帰宅後ログをみてみます。
swordone

2016/08/17 10:00

基礎を勉強してこれって、それ基礎全く理解できていませんよ。 setOnClickListenerの引数にはView.OnClickListenerオブジェクトが必要で、クリックされた際にはそのonClickメソッドが呼ばれるんですよ。 なぜActivityを渡してOKと思えるのかが不思議です。
syosinsya12

2016/08/17 11:09

引数は理解できるのですが、viewが引数というのはイメージができないです。intが引数なら数字を渡せばいいというのはわかるのですが、viewだと何を渡せばいいのでしょうか?
swordone

2016/08/17 11:36

それはプログラムで渡すわけではなく、Androidのクリックイベントが発生した時、Androidが「クリックされたView」をこのonClickに引数として渡すのです。
syosinsya12

2016/08/17 11:57

viewの具体的な値としてはどんなものがあるのですか?
swordone

2016/08/17 12:28

値ではありません。ButtonならクリックされたButtonが引数として渡ります。
syosinsya12

2016/08/17 13:02

では記述内容としてはすべてviewという文字になるということですか?
swordone

2016/08/17 13:05

何を言っているかよくわかりませんが、このあたりの詳しい話をしようとするとJavaの根底にある「オブジェクト指向」を理解しないと難しい話になるので、ひとまずこういう形で書くんだということをまずは把握して下さい。
syosinsya12

2016/08/17 13:14

絶対にviewを引数に取らないといけないということですね。 それとlogcatのメッセージなのですが見ていただけますか? 08-17 22:10:52.414 18667-18667/com.example.sample.nameE/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.sample.name, PID: 18667 java.lang.IllegalStateException: Could not execute method for android:onClick at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293) at android.view.View.performClick(View.java:4569) at android.view.View$PerformClick.run(View.java:18553) at android.os.Handler.handleCallback(Handler.java:733) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:212) at android.app.ActivityThread.main(ActivityThread.java:5151) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) at android.view.View.performClick(View.java:4569)  at android.view.View$PerformClick.run(View.java:18553)  at android.os.Handler.handleCallback(Handler.java:733)  at android.os.Handler.dispatchMessage(Handler.java:95)  at android.os.Looper.loop(Looper.java:212)  at android.app.ActivityThread.main(ActivityThread.java:5151)  at java.lang.reflect.Method.invokeNative(Native Method)  at java.lang.reflect.Method.invoke(Method.java:515)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)  at dalvik.system.NativeStart.main(Native Method)  Caused by: java.lang.NullPointerException at android.content.ContextWrapper.getPackageName(ContextWrapper.java:135) at android.content.ComponentName.<init>(ComponentName.java:77) at android.content.Intent.<init>(Intent.java:3826) at com.example.sample.name.ann.A.get_i1(A.java:166) at com.example.sample.name.ann.I.get_i1(I.java:26) at java.lang.reflect.Method.invokeNative(Native Method)  at java.lang.reflect.Method.invoke(Method.java:515)  at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)  at android.view.View.performClick(View.java:4569)  at android.view.View$PerformClick.run(View.java:18553)  at android.os.Handler.handleCallback(Handler.java:733)  at android.os.Handler.dispatchMessage(Handler.java:95)  at android.os.Looper.loop(Looper.java:212)  at android.app.ActivityThread.main(ActivityThread.java:5151)  at java.lang.reflect.Method.invokeNative(Native Method)  at java.lang.reflect.Method.invoke(Method.java:515)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)  at dalvik.system.NativeStart.main(Native Method) 
swordone

2016/08/17 13:18

これは…レイアウトのXMLでクリックイベントを設定していますか?
syosinsya12

2016/08/17 13:24

Iのレイアウトですよね? <Button android:id="@+id/i1" android:onClick="get_i1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/i1"/> こんな感じでボタンを配置しています。クリックイベントの設定とはonClick属性がついているかどうかということでしょうか?
swordone

2016/08/17 13:27

これは根本的にやり方が違うので、最初のサイトを参考にはできませんね。
syosinsya12

2016/08/17 13:33

なるほど。このやりかたで今の状態だとどんなエラー内容になっているのですか?メッセージのどこを見て判断しているのでしょうか?
swordone

2016/08/17 13:51

java.lang.IllegalStateException: Could not execute method for android:onClick この行で「onClickイベントが実行できなかった」と読み取れます。その原因として Caused by: java.lang.reflect.InvocationTargetException と出ています。私も詳しくは自身がないですが、実行対象がなかったというふうに考えられます。 あとActivityであるAがnewで生成されているのもおかしいです。 結論:最初から書き直したほうがいい
syosinsya12

2016/08/17 14:12

いまのコードだとget_i1をクリックするとAのget_i1メソッドを呼んでくれ。と書いたつもりなのですがまったく見当はずれということでしょうか? 最初から書き直す方向で考えてみようと思いますが、有識者様からみてこうした方がいいなど道筋としてのアドバイスをいただいてもよろしいでしょうか?
退会済みユーザー

退会済みユーザー

2016/08/17 14:51

根本として Caused by: java.lang.NullPointerException at android.content.ContextWrapper.getPackageName(ContextWrapper.java:135) at android.content.ComponentName.<init>(ComponentName.java:77) at android.content.Intent.<init>(Intent.java:3826) at com.example.sample.name.ann.A.get_i1(A.java:166) と new Intent している時に渡しているコンポネートが不完全
syosinsya12

2016/08/17 15:16

不完全というのはどう修正すればよいのでしょうか?
swordone

2016/08/17 15:30

推測ですが、Activityを正規の方法で起動せず、newによってインスタンス生成すると、本来Activityが持つべきコンテキスト情報を持たない状態になるのだと思います。 修正方法は回答に追記しました。
syosinsya12

2016/08/18 05:57

start activityの部分にcannot resolve method start Activity(android.content.intent)とエラーメッセージが出てしまいます。
swordone

2016/08/18 14:48

startActivityをcontextから起動しないといけませんでした。訂正しました。
syosinsya12

2016/08/20 06:01

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問