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
<?xml version="1.0" encoding="utf-8"?> <FrameLayout 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:layout_alignParentTop="true" android:layout_centerHorizontal="true" tools:context="com.example.jacob.wutk.radio"> <ImageView android:id="@+id/imageView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="left|center_vertical" android:scaleType="centerCrop" android:src="@drawable/background_mic1"/> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:paddingBottom="1.0dip" android:paddingLeft="4.0dip" android:paddingRight="4.0dip" android:paddingTop="5.0dip"> <ImageButton android:id="@+id/playPause" android:layout_width="0.0dip" android:layout_height="wrap_content" android:layout_weight="1.0" android:background="?android:selectableItemBackground" android:clickable="true" android:onClick="playPauseMusic" android:scaleType="fitCenter" android:src="@drawable/play1"/> <ImageView android:layout_width="0.0dip" android:layout_height="fill_parent" android:layout_marginRight="5dp" android:layout_weight="1.0" android:background="?android:selectableItemBackground" android:scaleType="fitCenter" android:src="@drawable/logo"/> </LinearLayout> </FrameLayout>
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 public method with single parameter View
, whereas 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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With