私はしばらくの間この問題に対処してきましたが、次のような関連するすべての質問を見てきました。 this one 、 this 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>
onClick
でxml
を定義すると、ここで特定のビューに対してImageButton
を定義する必要があります。このメソッドには2つの引数を指定できません。
あなたのエラーは、メソッドplayPauseMusic(View)が見つかりませんでしたは、コンパイラが単一のパラメータView
を持つメソッドを必要とすることを意味しています。2つのパラメータView
&ImageButton
これがエラーの原因です。メソッドから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
だから私はそのコードを削除した。
あなたのコードはおそらく以下で始まるべきです:
@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があります。使用します。