onClickListener 的麻烦
onClickListener trouble
所以,我正在 phone 上使用 Android AIDE 学习和开发一个非常小的应用程序,我有这样的代码:
package com.mycompany.myapp;
import android.app.*;
import android.os.*;
import android.widget.EditText;
import android.widget.Button;
import android.widget.Toast;
import android.view.View;
public class MainActivity extends Activity {
EditText edit1;
Button btn1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
edit1 = (EditText) findViewById(R.id.edit1);
btn1 = (Button) findViewById(R.id.btn1);
btn1.setOnClickListener(this);
//Problem (this) from AIDE error info: Method
'android.view.View.setOnClickListener(android.view.View.OnClickListener)' in 'android.widget.Button' can not be applied to '(com.mycompany.myapp.MainActivity)'//
}
public void OnClick(View v) {
switch (v.getId()){
case R.id.btn1:
Toast.makeText(getApplicationContext(),edit1.getText().toString(),Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
}
有什么问题?
您的 activity 必须实现 View.OnClickListener 接口
public class MainActivity extends Activity implements View.OnClickListener {
@Override
public void onClick(View view) {}
}
你知道 this
指的是什么,不是吗?这是你的 activity 的参考,但 setOnClickListener() 接受类型 View.OnClickListener 的参数,而不是你的 activity.
查看 official doc 中的示例代码:
final Button button = findViewById(R.id.button_id);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// Code here executes on main thread after user presses button
}
});
当您使用 new View.OnClickListener()
创建匿名内部 class 时,匿名 class 实现了 OnClick
接口。
如果您只是在 MainActivity 上实现 View.OnClickListener,则必须更改处理事件的方式,而且我认为您希望尽量减少重构量。
此代码有效(已测试)
package com.mycompany.myapp;
import android.app.*;
import android.os.*;
import android.widget.EditText;
import android.widget.Button;
import android.widget.Toast;
import android.view.View;
public class MainActivity extends Activity implements View.OnClickListener{
EditText edit12;
Button btn12;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
edit12 = (EditText) findViewById(R.id.edit1);
btn12 = (Button) findViewById(R.id.btn1);
btn12.setOnClickListener();
}
public void onClick(View v){
switch (v.getId()){
case R.id.btn12:
Toast.makeText(getApplicationContext(),edit1.getText().toString(),Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
}
所以,我正在 phone 上使用 Android AIDE 学习和开发一个非常小的应用程序,我有这样的代码:
package com.mycompany.myapp;
import android.app.*;
import android.os.*;
import android.widget.EditText;
import android.widget.Button;
import android.widget.Toast;
import android.view.View;
public class MainActivity extends Activity {
EditText edit1;
Button btn1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
edit1 = (EditText) findViewById(R.id.edit1);
btn1 = (Button) findViewById(R.id.btn1);
btn1.setOnClickListener(this);
//Problem (this) from AIDE error info: Method
'android.view.View.setOnClickListener(android.view.View.OnClickListener)' in 'android.widget.Button' can not be applied to '(com.mycompany.myapp.MainActivity)'//
}
public void OnClick(View v) {
switch (v.getId()){
case R.id.btn1:
Toast.makeText(getApplicationContext(),edit1.getText().toString(),Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
}
有什么问题?
您的 activity 必须实现 View.OnClickListener 接口
public class MainActivity extends Activity implements View.OnClickListener {
@Override
public void onClick(View view) {}
}
你知道 this
指的是什么,不是吗?这是你的 activity 的参考,但 setOnClickListener() 接受类型 View.OnClickListener 的参数,而不是你的 activity.
查看 official doc 中的示例代码:
final Button button = findViewById(R.id.button_id);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// Code here executes on main thread after user presses button
}
});
当您使用 new View.OnClickListener()
创建匿名内部 class 时,匿名 class 实现了 OnClick
接口。
如果您只是在 MainActivity 上实现 View.OnClickListener,则必须更改处理事件的方式,而且我认为您希望尽量减少重构量。
此代码有效(已测试)
package com.mycompany.myapp;
import android.app.*;
import android.os.*;
import android.widget.EditText;
import android.widget.Button;
import android.widget.Toast;
import android.view.View;
public class MainActivity extends Activity implements View.OnClickListener{
EditText edit12;
Button btn12;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
edit12 = (EditText) findViewById(R.id.edit1);
btn12 = (Button) findViewById(R.id.btn1);
btn12.setOnClickListener();
}
public void onClick(View v){
switch (v.getId()){
case R.id.btn12:
Toast.makeText(getApplicationContext(),edit1.getText().toString(),Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
}