按钮单击处理程序在Android Studio中不起作用

时间:2017-02-03 16:31:47

标签: android android-button

我的活动的目录结构如下所示

enter image description here

这就是为什么要获得按钮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) {
    }
});

完整的活动代码

package 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);
    }
}

6 个答案:

答案 0 :(得分:2)

首先,在一个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);  

如果你这样做,你必须在你的活动中实现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);
}

答案 1 :(得分:2)

删除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();
            }
        });
    }
}

答案 2 :(得分:1)

@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()创建的实例完全不同。您似乎在混合我们为片段扩展视图的方式以及我们为活动执行此操作的方式。在“活动”中,我们只需拨打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()中使用的布局名称。如果你总是遵循这种模式,你将避免很多头痛。

答案 3 :(得分:1)

最好的解决方法是在setContentView(R.layout.activity_login)方法中使用onCreate(),然后点击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();
   }
 });
}

答案 4 :(得分:0)

假设你做了@ Code-Apprentice所说的(做了一些事情),还有其他事情可以发生:

  • 按钮clickable?在布局中检查它或用

    设置它

    btnLogin.setClickable(true);

  • 是按钮enabled?与以前相同。

  • 是否还有另一个View重叠按钮,可以抓住之前的点击数据?

答案 5 :(得分:0)

我变了

Toast.makeText(getApplicationContext(),"Button was Clicked", Toast.LENGTH_SHORT).show();

Toast.makeText(getApplicationContext(),"Button was Clicked", Toast.LENGTH_LONG).show();

它对我有用