web-dev-qa-db-ja.com

親または祖先のコンテキストでメソッドが見つかりませんでした

私はしばらくの間この問題に対処してきましたが、次のような関連するすべての質問を見てきました。 this onethis one 、および これ 。このエラーを修正できますか? 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'

関連コード:

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

onClickxmlを定義すると、ここで特定のビューに対してImageButtonを定義する必要があります。このメソッドには2つの引数を指定できません。

あなたのエラーは、メソッドplayPauseMusic(View)が見つかりませんでしたは、コンパイラが単一のパラメータViewを持つメソッドを必要とすることを意味しています。2つのパラメータViewImageButtonこれがエラーの原因です。メソッドから1つの引数を削除するだけで機能します。

このようにします:

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);
}
}

もう1つ書いてAndroid:onClick="playPauseMusic"は、ボタンのクリック時にメソッドplayPauseMusicが呼び出されるため、ボタンのクリックを既に定義しているので、メソッド内で定義する必要はありません by playPause.setOnClickListenerだから私はそのコードを削除した。

9
Janki Gadhiya

あなたのコードはおそらく以下で始まるべきです:

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

XmlでonClickを指定しています

Android:onClick="playPauseMusic"

そのため、このメソッドは機能し、内部のonClicksも取得できます。それらがいくつかのビューである場合。

たとえば、コード内のXMLから初期化して取得する必要があります。たとえば、

IDが「playPause」であるxmlにImageButtonがある場合

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
        }
    });
}

あなたの場合、xmlにはonClick属性があり、コードには別のonCLickがあります。使用します。

5
johnrao07