我的活动的目录结构如下所示
这就是为什么要获得按钮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);
}
}
答案 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();
它对我有用