2016-12-14 102 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

你需要從你的崩潰發佈stacktrace。但很可能您的方法名稱與您(在xml佈局文件中)(明顯)命名的方法名稱不匹配。 – codeMagic

+0

android:onClick =「llamar(MainActivity)chage this to llamar –

+0

哦,它的工作原理比你想象的要多:D – Nemeium

回答

0

當您定義android:onClick="someMethod"屬性時,Android僅爲您執行OnClickListener

這兩個代碼片段完全相同,但只是以兩種不同的方式實現。

代碼實現

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實現

<?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 --> 

現在在後臺的Android確實沒有什麼比Java代碼中調用您的單擊事件的方法別人。

請注意,使用上述XML,Android將僅在當前Activity中查找onClick方法llamar()。如果您使用fragments,這一點很重要,因爲即使您使用片段添加上面的XML,Android也會而不是在用於添加XML的片段的.java文件中查找onClick方法。

0
android:onClick="llamar" 

它不應該是這樣嗎?

相關問題