2016-12-14 13 views
1

私はこのボットンに問題があります。アプリケーションをクリックすると、 "ImageButton has stopped"というメッセージが送信されます。私はそれが何かばかだと思うが、私はちょうどコーディングを始めた。私のコードの詳細は以下の通りです。Androidは自分のOnClickメソッドを見つけることができません

LogCat:

12-13 21:01:56.659 1075-1075/com.example.christian.imagebutton E/AndroidRuntime: FATAL EXCEPTION: main 
                      Process: com.example.christian.imagebutton, PID: 1075 
                      java.lang.IllegalStateException: Could not find method llamar(MainActivity)(View) in a parent or ancestor Context for android:onClick attribute defined on view class android.support.v7.widget.AppCompatImageButton with id 'boton1' 
                       at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.resolveMethod(AppCompatViewInflater.java:327) 
                       at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:284) 
                       at android.view.View.performClick(View.java:5637) 
                       at android.view.View$PerformClick.run(View.java:22429) 
                       at android.os.Handler.handleCallback(Handler.java:751) 
                       at android.os.Handler.dispatchMessage(Handler.java:95) 
                       at android.os.Looper.loop(Looper.java:154) 
                       at android.app.ActivityThread.main(ActivityThread.java:6119) 
                       at java.lang.reflect.Method.invoke(Native Method) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 

主な活動

package com.example.christian.imagebutton; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.TextView; 

public class MainActivity extends AppCompatActivity { 
    private TextView tv1; 

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

    tv1=(TextView)findViewById(R.id.tv1); 

} 
public void llamar(View view){ 
    tv1.setText("Llamando"); 
    } 
} 

とレイアウトは次のとおりです。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/activity_main" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
tools:context="com.example.christian.imagebutton.MainActivity"> 

<ImageButton 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    app:srcCompat="@mipmap/telefono" 
    android:layout_alignParentTop="true" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" 
    android:id="@+id/boton1" 
    android:onClick="llamar(MainActivity)" /> 

<TextView 
    android:text="TextView" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_below="@+id/boton1" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" 
    android:layout_marginTop="22dp" 
    android:id="@+id/tv1" /> 
</RelativeLayout> 
+1

クラッシュからスタックトレースを送信する必要があります。しかし、おそらく、あなたのメソッド名は、あなたのXMLレイアウトファイル内の名前(あなたの名前)と一致しない可能性があります。 – codeMagic

+0

android:onClick = "llamar(MainActivity)これをllamarに変更する –

+0

ああ、それはとてもうまく動作します:D – Nemeium

答えて

0

android:onClick="someMethod"属性を定義すると、Androidは単にOnClickListenerを実装します。

これら2つのコードスニペットはまったく同じですが、2つの異なる方法で実装されています。

コードの実装

Button btn = (Button) findViewById(R.id.mybutton); 

btn.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     llamar(v); 
    } 
}); 

// some more code 

public void llamar(View v) { 
    // does something very interesting 
} 

上記はOnClickListenerのコードの実装です。そして今、XMLの実装。

<?xml version="1.0" encoding="utf-8"?> 
<!-- layout elements --> 
<Button android:id="@+id/mybutton" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Click me!" 
    android:onClick="llamar" /> 
<!-- even more layout elements --> 

XMLの実装は今、バックグラウンドでのAndroidは、クリックイベントに、あなたのメソッドを呼び出すJavaコードよりも他には何もしません。

上記のXMLでは、Androidは現在のアクティビティでonClickメソッドllamar()のみを検索します。これは、fragmentsを使用している場合は覚えておくことが重要です。フラグメントを使用して上記のXMLを追加しても、であり、XMLを追加するフラグメントの.javaファイルでonClickメソッドを探します。

0
android:onClick="llamar" 

が、それはこのようにすべきではありませんか?

関連する問題