按钮单击处理程序在 Android Studio 中不起作用
Button Click handler is not working in Android Studio
我的activity目录结构如下
这就是获取按钮id的原因,我写了下面的代码
View rootView = getLayoutInflater().inflate(R.layout.activity_login, null, false);
btnLogin = (Button)rootView.findViewById(R.id.btnLogin);
但是,由于某些原因,当我点击按钮时,它没有进入处理程序。我错过了什么吗?我的代码如下。
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
Activity
的完整代码
包 com.example.pankajgarg.android.Activities.UserManagement.Auth.Login;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import com.example.pankajgarg.android.R;
public class LoginActivity extends AppCompatActivity {
Button btnLogin;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View rootView = getLayoutInflater().inflate(R.layout.activity_login, null, false);
btnLogin = (Button)rootView.findViewById(R.id.btnLogin);
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(getApplicationContext(),"Button was Clicked", Toast.LENGTH_SHORT).show();
}
});
setContentView(R.layout.activity_login);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View rootView = getLayoutInflater().inflate(R.layout.activity_login, null, false);
btnLogin = (Button)rootView.findViewById(R.id.btnLogin);
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(getApplicationContext(),"Button was Clicked", Toast.LENGTH_SHORT).show();
}
});
setContentView(R.layout.activity_login);
}
setContentView(R.layout.activity_login);
行扩充了布局并显示了 XML 中定义的视图。这些实例与之前调用 inflate()
创建的实例完全不同。您似乎混合了我们为片段膨胀视图的方式和我们为 activity 膨胀视图的方式。在 Activities 中,我们只需调用 setContentView()
。这意味着您应该将代码更改为以下内容:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
btnLogin = (Button)findViewById(R.id.btnLogin);
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(getApplicationContext(),"Button was Clicked", Toast.LENGTH_SHORT).show();
}
});
}
现在设置 OnClickListener
的代码将找到正确的按钮。
请注意,onCreate()
的前两行将始终如此处所示。唯一的区别是 setContentView()
中使用的布局名称。如果您始终遵循此模式,您将避免很多头痛。
假设您按照@Code-Apprentice 所说的做了(执行某些操作),还有其他可能发生的事情:
按钮是clickable
吗?在布局中勾选或设置为
btnLogin.setClickable(true);
是按钮enabled
?和以前一样。
是否有其他 View
重叠在按钮之前捕获点击的按钮?
首先,在 Activity 中,您不需要扩充布局,而是将其与 setContentView
方法链接:
setContentView(R.layout.activity_login);
其次,如果您想以匿名方式执行此操作,您已准备就绪,但要在 onClick 方法中添加一些内容:
btnLogin = (Button)findViewById(R.id.btnLogin);
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// do whatever like...
Log.d("MyActivity", "Click!");
Toast.makeText(this, "Click!", Toast.LENGTH_SHORT);
}
});
或者你可以这样做:
btnLogin = (Button)findViewById(R.id.btnLogin);
btnLogin.setOnClickListener(this);
如果你这样做,你必须在你的Activity中实现View.OnClickListener
:
public class LoginActivity extends Activity implements View.OnClickListener {
// Your Activity code
}
最后,再说一次,如果您在点击方法中不做任何事情,Android 将不会这样做,所以:
@Override
public void onClick(View view) {
// do whatever like...
Log.d("MyActivity", "Click!");
Toast.makeText(this, "Click!", Toast.LENGTH_SHORT);
}
最好的方法是在 onCreate()
方法中使用 setContentView(R.layout.activity_login)
,然后使用 findViewById(R.id.btnLogin)
拉按钮。
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//insert this line here
setContentView(R.layout.activity_login);
//Pull the button with the id
btnLogin = (Button) findViewById(R.id.btnLogin);
//set onclicklistener
btnLogin.setOnClickListener(new View.OnClickListener(){
public void onClick(View view){
Toast.makeText(getApplicationContext(),"Button was Clicked", Toast.LENGTH_SHORT).show();
}
});
}
删除View rootView = getLayoutInflater().inflate(R.layout.activity_login, null, false);
并替换为setContentView
public class LoginActivity extends AppCompatActivity {
Button btnLogin;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
btnLogin = (Button) findViewById(R.id.btnLogin);
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(getApplicationContext(),"Button was Clicked", Toast.LENGTH_SHORT).show();
}
});
}
}
我变了
Toast.makeText(getApplicationContext(),"Button was Clicked", Toast.LENGTH_SHORT).show();
至
Toast.makeText(getApplicationContext(),"Button was Clicked", Toast.LENGTH_LONG).show();
对我有用
我的activity目录结构如下
这就是获取按钮id的原因,我写了下面的代码
View rootView = getLayoutInflater().inflate(R.layout.activity_login, null, false);
btnLogin = (Button)rootView.findViewById(R.id.btnLogin);
但是,由于某些原因,当我点击按钮时,它没有进入处理程序。我错过了什么吗?我的代码如下。
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
Activity
的完整代码包 com.example.pankajgarg.android.Activities.UserManagement.Auth.Login;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import com.example.pankajgarg.android.R;
public class LoginActivity extends AppCompatActivity {
Button btnLogin;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View rootView = getLayoutInflater().inflate(R.layout.activity_login, null, false);
btnLogin = (Button)rootView.findViewById(R.id.btnLogin);
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(getApplicationContext(),"Button was Clicked", Toast.LENGTH_SHORT).show();
}
});
setContentView(R.layout.activity_login);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View rootView = getLayoutInflater().inflate(R.layout.activity_login, null, false);
btnLogin = (Button)rootView.findViewById(R.id.btnLogin);
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(getApplicationContext(),"Button was Clicked", Toast.LENGTH_SHORT).show();
}
});
setContentView(R.layout.activity_login);
}
setContentView(R.layout.activity_login);
行扩充了布局并显示了 XML 中定义的视图。这些实例与之前调用 inflate()
创建的实例完全不同。您似乎混合了我们为片段膨胀视图的方式和我们为 activity 膨胀视图的方式。在 Activities 中,我们只需调用 setContentView()
。这意味着您应该将代码更改为以下内容:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
btnLogin = (Button)findViewById(R.id.btnLogin);
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(getApplicationContext(),"Button was Clicked", Toast.LENGTH_SHORT).show();
}
});
}
现在设置 OnClickListener
的代码将找到正确的按钮。
请注意,onCreate()
的前两行将始终如此处所示。唯一的区别是 setContentView()
中使用的布局名称。如果您始终遵循此模式,您将避免很多头痛。
假设您按照@Code-Apprentice 所说的做了(执行某些操作),还有其他可能发生的事情:
按钮是
clickable
吗?在布局中勾选或设置为btnLogin.setClickable(true);
是按钮
enabled
?和以前一样。是否有其他
View
重叠在按钮之前捕获点击的按钮?
首先,在 Activity 中,您不需要扩充布局,而是将其与 setContentView
方法链接:
setContentView(R.layout.activity_login);
其次,如果您想以匿名方式执行此操作,您已准备就绪,但要在 onClick 方法中添加一些内容:
btnLogin = (Button)findViewById(R.id.btnLogin);
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// do whatever like...
Log.d("MyActivity", "Click!");
Toast.makeText(this, "Click!", Toast.LENGTH_SHORT);
}
});
或者你可以这样做:
btnLogin = (Button)findViewById(R.id.btnLogin);
btnLogin.setOnClickListener(this);
如果你这样做,你必须在你的Activity中实现View.OnClickListener
:
public class LoginActivity extends Activity implements View.OnClickListener {
// Your Activity code
}
最后,再说一次,如果您在点击方法中不做任何事情,Android 将不会这样做,所以:
@Override
public void onClick(View view) {
// do whatever like...
Log.d("MyActivity", "Click!");
Toast.makeText(this, "Click!", Toast.LENGTH_SHORT);
}
最好的方法是在 onCreate()
方法中使用 setContentView(R.layout.activity_login)
,然后使用 findViewById(R.id.btnLogin)
拉按钮。
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//insert this line here
setContentView(R.layout.activity_login);
//Pull the button with the id
btnLogin = (Button) findViewById(R.id.btnLogin);
//set onclicklistener
btnLogin.setOnClickListener(new View.OnClickListener(){
public void onClick(View view){
Toast.makeText(getApplicationContext(),"Button was Clicked", Toast.LENGTH_SHORT).show();
}
});
}
删除View rootView = getLayoutInflater().inflate(R.layout.activity_login, null, false);
并替换为setContentView
public class LoginActivity extends AppCompatActivity {
Button btnLogin;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
btnLogin = (Button) findViewById(R.id.btnLogin);
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(getApplicationContext(),"Button was Clicked", Toast.LENGTH_SHORT).show();
}
});
}
}
我变了
Toast.makeText(getApplicationContext(),"Button was Clicked", Toast.LENGTH_SHORT).show();
至
Toast.makeText(getApplicationContext(),"Button was Clicked", Toast.LENGTH_LONG).show();
对我有用