web-dev-qa-db-fra.com

Impossible de trouver la méthode dans le contexte parent ou ancêtre

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>
24
McLemore

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.

9
Janki Gadhiya

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.

5
johnrao07