所以,我在Android Studio中弄乱了,我有一个看起来像这样的方法:
public void check(View view) {
EditText numberEditText = findViewById(R.id.number);
int number = Integer.parseInt(numberEditText.getText().toString());
Toast.makeText(this, getMessage(number), Toast.LENGTH_SHORT).show();
}
按下按钮时将调用该方法,该方法将按预期工作。但是,当我从方法中删除参数时,留下
public void check() {
EditText numberEditText = findViewById(R.id.number);
int number = Integer.parseInt(numberEditText.getText().toString());
Toast.makeText(this, getMessage(number), Toast.LENGTH_SHORT).show();
},
只要按下按钮,应用程序就会崩溃。我发现这很奇怪,因为我实际上没有使用传递的View
。我认为这是由于View
被传递而我没有接受任何参数的问题。有什么方法可以解决方法中的View
吗?我认为,当该方法接受不使用的参数时,会使代码更难以阅读。
这是堆栈跟踪:
08-08 19:37:55.120 11217-11217/com.example.corfi.numbershapes E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.corfi.numbershapes, PID: 11217
java.lang.IllegalStateException: Could not find method check(View) in a parent or ancestor Context for android:onClick attribute defined on view class android.support.v7.widget.AppCompatButton with id 'button3'
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.resolveMethod(AppCompatViewInflater.java:424)
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:381)
at android.view.View.performClick(View.java:6597)
at android.view.View.performClickInternal(View.java:6574)
at android.view.View.access$3100(View.java:778)
at android.view.View$PerformClick.run(View.java:25885)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
在此先感谢您的帮助!
答案 0 :(得分:6)
您已经通过设置
的xml布局实现了点击监听器。android:onClick="click"
现在,由于这个原因,预期的点击监听器功能为
public void click(View view){}
当单击按钮时,android控制器将视图传递给此活动,因此系统将知道单击的内容。
替代方法是不在布局内添加侦听器,也不在代码中添加侦听器
从布局xml中删除android:onClick部分
然后在您的代码中,首先找到按钮的视图
Button yourbutton = findViewById('R.id.yourbuttonid');
现在在此设置点击侦听器
yourbutton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
//Do your thing
}
});
即使在这里,您也可以看到内部方法传递了一个View。这是设计使然
答案 1 :(得分:1)
将针对每种情况下的侦听器提供View,如果要删除匿名侦听器和View参数,则可以尝试ButterKnife,如下所示使用它
@OnClick(R.id.yourButtonId)
public void onYourButtonClick(){
//your logic
}
答案 2 :(得分:0)
您需要在param中引用视图,因为它是android如何工作以查找视图组件的侦听器。
如果您查看documentation,则标准方法还会将视图放入参数中,例如以下代码块:
public class MyActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.content_layout_id);
final Button button = findViewById(R.id.button_id);
button.setOnClickListener(new View.OnClickListener() {
// On click method has parameter View v
public void onClick(View v) {
// Code here executes on main thread after user presses button
}
});
}
}