Could not find method in parent or ancestor context

匿名 (未验证) 提交于 2019-12-03 01:25:01

问题:

I've been dealing with this problem for awhile and have looked at all the relevant questions I could find, such as: this one, this one, and this one. Could you help me correct this error? It's the only one being thrown by the logcat.

java.lang.IllegalStateException: Could not find method playPauseMusic(View) in a parent or ancestor Context for android:onClick attribute defined on view class android.support.v7.widget.AppCompatImageButton with id 'playPause'

Relevant code:

radio.java

package com.example.jacob.wutk;  import android.media.AudioManager; import android.media.MediaPlayer; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.ImageButton;  import java.io.IOException;  public class radio extends AppCompatActivity {      /** Called when the user touches the button */      public void playPauseMusic (View view, final ImageButton playPause) throws IOException {         String url = "http://streamer.cci.utk.edu:8000/wutk-vorbis"; // your URL here         final MediaPlayer mediaPlayer = new MediaPlayer();          mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {              public void onPrepared(MediaPlayer mediaPlayer){                 mediaPlayer.start();             }         });          playPause.setOnClickListener(new View.OnClickListener(){             public void onClick(View view) {                 if (mediaPlayer.isPlaying()) {                     mediaPlayer.pause();                     playPause.setImageResource(R.drawable.play1);                 } else {                     playPause.setImageResource(R.drawable.pause1);                 }             }         });         mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);         mediaPlayer.setDataSource(url);         mediaPlayer.prepareAsync();     }      @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_radio);     } } 

activity_radio.xml

    

回答1:

Defining onClick in xml means you need to define it for a particular view here is ImageButton you can not have two arguments in that method.

Your error is also saying that Could not find method playPauseMusic(View) means compiler needs a methods with single parameter View where as you were having two parameters View & ImageButton this is the reason why you where getting that error. Just remove one argument from the method and it will work.

Do it like this :

public class radio extends AppCompatActivity {  /** Called when the user touches the button */  public void playPauseMusic (View playPause) {     String url = "http://streamer.cci.utk.edu:8000/wutk-vorbis"; // your URL here     final MediaPlayer mediaPlayer = new MediaPlayer();      mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {          public void onPrepared(MediaPlayer mediaPlayer){             mediaPlayer.start();         }     });       if (mediaPlayer.isPlaying()) {          mediaPlayer.pause();          ((ImageButton)playPause).setImageResource(R.drawable.play1);     } else {         ((ImageButton)playPause).setImageResource(R.drawable.pause1);     }      mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);     mediaPlayer.setDataSource(url);     mediaPlayer.prepareAsync(); }  @Override protected void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.activity_radio); } } 

One more thing writing android:onClick="playPauseMusic" means the method playPauseMusic will be called on Button click so you have already defined a button click so no need to define it inside the method by playPause.setOnClickListener so I have removed that code.



回答2:

Your code possibly should start with:

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

You're specifying onClick in xml

android:onClick="playPauseMusic" 

So, the method works, you've got inner onClicks too. If they are some views.

You gotta initialize and get it from the xml in code, for ex-

If you have ImageButton in xml, whose id is "playPause"

ImageButton playPause; //Declare it here if you wanna use it in all other places in the class or outside of your class  @Override protected void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.activity_radio);      playPause = (ImageButton)findViewById(R.id.playPause);      playPause.setOnClickListener(new View.OnClickListener(){         public void onClick(View view) {            //OnCLick Stuff         }     }); } 

In Your case, you've got onClick attribute in xml and another onCLick in code. You Use one.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!