2016-12-24 54 views
2

私はシンプルな岩、紙、はさみアプリを作成しようとしていますが押されますが、ユーザがR、P、またはSに関連ImageButtonsを選択したときに、私は方法は、それがそれぞれのImageButtonが

を取得します一度見つけることができません
"Could not find method in a parent or ancestor Context for android:onClick attribute defined on view class android.support.v7.widget.AppCompatImageButton with id" 

私はjavaファイルでこれらのメソッドをコメントアウトするとき、私は私が「//」を削除するので、androidstudioに思えるたらそれ

can't find the methods being called with the onClick attribute

とエラーが離れて行くと言っxmlでエラーが出ますメトを参照してくださいしかし、何らかの理由で、彼らがそこにいて呼び出されたら、それを見つけることができないでしょうか?重要なのは、これがアプリの2番目のアクティビティです(もう1つがメインです)。これは私が見たものとよく似たエラーですが、自分の状況に適した解決策を見つけることができませんでした。

は、これは私のXMLコード(activity_rps.xml)は、私が問題を引き起こしているImageButtons以外のすべてを除去して

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#ffffff" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.example.android.gamegroup.rps"> 

    <ImageButton 
     android:id="@+id/rps_paper" 
     android:layout_width="128dp" 
     android:layout_height="128dp" 
     android:layout_alignParentEnd="true" 
     android:layout_alignParentRight="true" 
     android:layout_centerVertical="true" 
     android:background="@drawable/rps_paper" 
     android:onClick="userChoicePaper" /> 

    <ImageButton 
     android:id="@+id/rps_scissors" 
     android:layout_width="128dp" 
     android:layout_height="128dp" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:background="@drawable/rps_scissors" 
     android:onClick="userChoiceScissors" /> 

    <ImageButton 
     android:id="@+id/rps_rock" 
     android:layout_width="128dp" 
     android:layout_height="128dp" 
     android:background="@drawable/rps_rock" 
     android:onClick="userChoiceRock" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" /> 
</RelativeLayout> 

これは私のJavaコード(rps.java)。私は問題に関連していない多くを削除しました。コメントアウトされているセクションは問題の絞り込みを試みています。

package com.example.android.gamegroup; 

import android.content.DialogInterface; 
import android.content.Intent; 
import android.os.Bundle; 
import android.support.v7.app.AlertDialog; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.ImageButton; 
import android.widget.TextView; 
import java.util.Random; 

public class rps extends AppCompatActivity { 
    //int userChoice, pcChoice, winner, userWinCount, pcWinCount; 
    //ImageButton choiceRock = (ImageButton) findViewById(R.id.rps_rock); 
    //ImageButton choicePaper = (ImageButton) findViewById(R.id.rps_paper); 
    //ImageButton choiceScissors = (ImageButton) 
findViewById(R.id.rps_scissors); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_rps); 

     //userWinCount = 0; 
     //pcWinCount = 0; 
    } 

    // Generate a random integer ranging from 1 to 3 for 
    public void setPcChoice() { 
     int randNum; 
     Random randInt = new Random(); 
     randNum = randInt.nextInt(3) + 1; 
     //pcChoice = randNum; 
    } 

    // Change userChoice to 1 for picking rock, assign pcChoice, assign 
    public void userChoiceRock(View view) 
    { 
     //choiceRock.setImageResource(R.drawable.rps_blue_rock); 
     //userChoice = 1; 
     setPcChoice(); 
     //setWinner(); 

    } 

    // Change userChoice to 2 for picking paper, assign pcChoice, assign winner 
    public void userChoicePaper(View view) 
    { 
     //choicePaper.setImageResource(R.drawable.rps_blue_paper); 
     //userChoice = 2; 
     setPcChoice(); 
     //setWinner(); 
    } 

    // Change userChoice to 3 for picking scissors, assign pcChoice, assign winner****************** 
    public void userChoiceScissors(View view) 
    { 
     //choiceScissors.setImageResource(R.drawable.rps_blue_scissors); 
     //userChoice = 3; 
     setPcChoice(); 
     //setWinner(); 
    } 

} 
+1

ボタンの 'onClick'プロパティで定義されたメソッドを使うのではなく、ボタンごとに' onClickListener'を登録して、 'onClick'メソッドでやりたいことをすることができます。 – Zelig63

+0

onCreateメソッド内のすべてのimageButtonのfindIdを実行し、ビュー上でonClickListenerを設定します。 – Bhavnik

+0

@ Zelig63は正しいです。 'onml'を' xml'で使用すると、ときどき他のものと競合することがあります。ですから、Javaコードで 'OnClickListener'を使う方が良いでしょう。私はあなたに役立つかもしれない下記の答えを加えました。 –

答えて

0

あなたのxmlでそれを使用しての代わりにJavaコードでOnClickListenerを使用することをお勧めします。あなたは以下のようにあなたのrps.javaを変更する必要があることを行うには:

public class rps extends AppCompatActivity { 
    //int userChoice, pcChoice, winner, userWinCount, pcWinCount; 
    ImageButton choiceRock; 
    ImageButton choicePaper; 
    ImageButton choiceScissors; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_rps); 

     choiceRock = (ImageButton) findViewById(R.id.rps_rock); 
     choicePaper = (ImageButton) findViewById(R.id.rps_paper); 
     choiceScissors = (ImageButton) findViewById(R.id.rps_scissors); 

     choiceRock.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View arg0) { 
       //choiceRock.setImageResource(R.drawable.rps_blue_rock); 
       //userChoice = 1; 
       setPcChoice(); 
       //setWinner(); 
      } 
     }); 

     choicePaper.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View arg0) { 
       //choicePaper.setImageResource(R.drawable.rps_blue_paper); 
       //userChoice = 2; 
       setPcChoice(); 
       //setWinner(); 
      } 
     }); 

     choiceScissors.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View arg0) { 
       //choiceScissors.setImageResource(R.drawable.rps_blue_scissors); 
       //userChoice = 3; 
       setPcChoice(); 
       //setWinner(); 
      } 
     }); 

     //userWinCount = 0; 
     //pcWinCount = 0; 
    } 

    public void setPcChoice() { 
     int randNum; 
     Random randInt = new Random(); 
     randNum = randInt.nextInt(3) + 1; 
     //pcChoice = randNum; 
    } 
} 

をそして最後に、あなたのxmlファイルに3 ImageButtonから部分を削除します。

+1

これですべてがうまくいくはずです。ありがとうございます。なぜそれが問題だったのか説明できますか?私はこれも何らかの方法で学びたいと思っています。 –

+0

あなたは 'activity_rps.xml'で' onClick'を使っていましたが、この特定のアクティビティは 'rps.java'ファイルの' onCreate(Bundle savedInstanceState) 'メソッドで作成されています。しかし、 'userChoiceRock(View view)'のようなメソッドは同じクラスの中にあります。したがって、それらのonClickイベントをアクティブにロードできませんでした。 –

+0

私のソリューションでは、 'onCreate(Bundle savedInstanceState)'メソッドの中に3つの画像ビューを初期化しました。そのため、画像ボタンは 'xml'レイアウトから同じidで正しくアタッチされました。 'setOnClickListener()'メソッドは、 'xml'レイアウトで試していたこのクラスの中の' onClick'アクションを達成するために使用されます。 Javaの基本知識があれば、ここで 'OnClickListener'がどのように働いているのか理解してくれることを願っています。 –

関連する問題