Je traite ce problème depuis un moment et j'ai examiné toutes les questions pertinentes que je pouvais trouver, telles que: celui-ci , celui-ci , et celui-ci . Pourriez-vous m'aider à corriger cette erreur? C'est le seul lancé par le 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'
Code pertinent:
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>
Définir onClick
dans xml
signifie que vous devez le définir pour une vue particulière, voici ImageButton
vous ne pouvez pas avoir deux arguments dans cette méthode.
Votre erreur indique également que Impossible de trouver la méthode playPauseMusic (View) signifie que le compilateur a besoin de méthodes avec un paramètre unique View
alors que vous aviez deux paramètres View
& ImageButton
c'est la raison pour laquelle vous avez eu cette erreur. Supprimez simplement un argument de la méthode et cela fonctionnera.
Fais-le comme ça :
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);
}
}
Une dernière chose à écrire Android:onClick="playPauseMusic"
signifie que la méthode playPauseMusic
sera appelée lors d’un clic sur un bouton, vous avez donc déjà défini un clic sur un bouton ainsi inutile de le définir dans la méthode par playPause.setOnClickListener
donc j'ai supprimé ce code.
Votre code devrait éventuellement commencer par:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_radio);
}
Vous spécifiez onClick en XML
Android:onClick="playPauseMusic"
Ainsi, la méthode fonctionne, vous avez également onClicks intérieur. Si ce sont des vues.
Vous devez l’initialiser et l’obtenir à partir du code XML en code, par exemple.
Si vous avez ImageButton en xml, son identifiant est "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
}
});
}
Dans votre cas, vous avez l'attribut onClick au format xml et un autre onCLick au code. Vous en utilisez un.