按钮单击处理程序在 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();

对我有用