2016-07-15 362 views
7

Ho avuto a che fare con questo problema per un po 'e ho esaminato tutte le domande pertinenti che ho trovato, come ad esempio: this one, this one e this one. Potresti aiutarmi a correggere questo errore? È l'unico a essere lanciato dal logcat.Impossibile trovare il metodo nel contesto padre o antenato

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'

codice rilevante:

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> 
+0

Questo è tutto in 'radio_activity' – McLemore

+0

Posso vedere il codice in cui si sta chiamando questo metodo' playPauseMusic' ?? ** chiamato quando l'utente tocca il pulsante ** posso vedere quel codice pulsante ?? –

+0

È in 'radio_activity'. È il ImageButton. – McLemore

risposta

3

Definire onClick in xml significa che è necessario definirlo per una vista particolare qui è ImageButton non è possibile avere due argomenti in tale metodo.

Il tuo errore è anche dicendo che Impossibile trovare il metodo playPauseMusic (View) significa compilatore ha bisogno di un metodi con singolo parametro View dove, come si stavano avendo due parametri View & ImageButton questo è il motivo per cui si dove ottenere che errore. Basta rimuovere un argomento dal metodo e funzionerà.

fare in questo modo:

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.

+0

Dà un errore che 'playPause' deve essere dichiarato definitivo. L'ho fatto, 'final View playPause' e ​​ora ho un errore di Build:' Errore: (39, 30) errore: impossibile trovare il metodo symbol setImageResource (int) '. Eventuali suggerimenti? – McLemore

+0

sei sicuro di aver rimosso 'playPause.setOnClickListener' nel lato del metodo come ho fatto nel codice precedente ?? per favore copia-incolla il codice sopra e dimmi se il problema persiste ancora .. !! –

+0

Non l'avevo visto quando ho fatto il commento. Sto aspettando la costruzione. EDIT: Sì, l'errore sopra è ancora generato. – McLemore

1

Il codice poss ibly dovrebbe iniziare con:

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

Stai specificando onClick in xml

android:onClick="playPauseMusic" 

Così, il metodo funziona, hai onClicks interni troppo. Se sono alcune viste.

Devi inizializzare e ottenere dal XML in codice, per ex

Se hai ImageButton in XML, il cui ID è "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 
     } 
    }); 
} 

nel tuo caso, hai ottenuto attributo onClick in xml e un altro onCLick nel codice. Si usa uno.