使用onClick(MainActivity)的Android按钮IllegalStateException

时间:2017-01-29 15:36:45

标签: android

全新的android。我有一个按钮,它应该触发onClick方法,该方法是与onClickListener一起使用的onClick方法的重写。问题是当我按下按钮时会抛出IllegalStateException,说明无法找到onClick(MainActivity),如按钮的XML中所定义的那样。

下面的代码是抛出IllegalStateException的代码。但是,如果我将按钮的XML更改为android:onClick =“onClick”,则该按钮完全正常。这是为什么?

按钮XML:

<Button
    android:text="Accept"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/editText2"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="84dp"
    android:id="@+id/button2"
    android:onClick="onClick (MainActivity)" />

MainActivity Code:

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Button;
import android.widget.EditText;



public class MainActivity extends Activity implements View.OnClickListener{

private TextView textView;
private EditText username;
private EditText password;
private Button accept;

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

    textView = (TextView) findViewById(R.id.textView3);
    username = (EditText) findViewById(R.id.editText);
    password = (EditText) findViewById(R.id.editText2);
    accept = (Button) findViewById(R.id.button2);
}

public void logIn(View view)
{
    Log.i("testUsername", username.getText().toString());
    Log.i("testPassword", password.getText().toString());
}

@Override
public void onClick(View view)
{
    if((Button)view == accept)
    {
        Log.i("testUsername", username.getText().toString());
        Log.i("testPassword", password.getText().toString());
    }
}


}

2 个答案:

答案 0 :(得分:2)

  

为什么会这样?

因为android:onClick="onClick"是正确的语法。以下都不是正确的语法:

  • android:onClick="onClick (MainActivity)"
  • android:onClick="onClick (View)"
  • android:onClick="onClick(View)"
  • android:onClick="onClick and anything else"

引用the documentation for android:onClick

  

单击视图时要调用的此View上下文中的方法的名称。此名称必须对应于只接受View类型的一个参数的公共方法。例如,如果指定android:onClick =&#34; sayHello&#34;,则必须声明上下文的公共void sayHello(View v)方法(通常是您的Activity)。

好的,在Twitter上@HappyRavi的帮助下,我能够reproduce the problem。如果您按特定顺序执行操作,则会遇到IDE错误:

  • 添加要将click事件路由到
  • 的方法
  • Button拖到GUI编辑器
  • 单击GUI编辑器的“属性”窗格中的onClick下拉列表

以不同的顺序执行操作不会重现问题。

幸运的是,他们可以在Android Studio 2.3的某些补丁版本中修复此问题。

答案 1 :(得分:0)

应该像下面这样实现

<Button
android:text="Accept"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/editText2"
android:layout_centerHorizontal="true"
android:layout_marginTop="84dp"
android:id="@+id/button2"
android:onClick="buttonClickHandler" />//name of method should be given here

并在活动文件中添加方法

public void buttonClickHandler(View view) {
  //handle button click here
}

只有在Activity课程中添加方法而不是Fragment

时才会有效