2016-12-14 110 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" 

它不应该是这样吗?

相关问题