android 编辑直接作为参数传递给对象函数或构造函数的文本值不起作用
android edit text value passed directly as parameter to object functions or constructors not working
下面是class代码:
public class UserInfo
{
String userName;
String userPass;
public UserInfo(){
}
public UserInfo(String userName, String userPass){
userName=this.userName;
userPass=this.userPass;
}
public void setUserName(String userName){
userName=this.userName;
}
public void setUserPass(String userPass){
userPass=this.userPass;
}
}
如果我将字符串从 activity 传递给对象函数,如下所示:userInfo.setUserName(et_login_user_name.getText().toString());
那么用户名没有设置为编辑框的值。它被设置为空。
但是如果我设置值如下:
userInfo.userName=et_login_user_name.getText().toString();
然后代码可以正常工作。
下面是activityclass代码:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
final Context ctx=this;
final Button bt_login=(Button)findViewById(R.id.button5);
bt_login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
UserInfo userInfo = new UserInfo();
EditText et_login_user_name=(EditText)findViewById(R.id.editText);
EditText et_login_user_pass=(EditText)findViewById(R.id.editText2);
// userInfo.setUserName(et_login_user_name.getText().toString()); -not working
// userInfo.setUserPass(et_login_user_pass.getText().toString()); -not working
userInfo.userName=et_login_user_name.getText().toString(); // working
userInfo.userPass=et_login_user_pass.getText().toString(); // working
if(userInfo.userPass.isEmpty()||userInfo.userName.isEmpty()) //get null pointer exception for non working code
{
//some code
}
您分配的值不正确,您没有将值分配给 class 成员,而是将 class 成员值分配给传递的参数。即代替
用户名 = this.userName 使用
this.userName = 用户名;
使用这个,您可以从 class 变量中为局部函数变量赋值。下面的代码现在适合你
public class UserInfo
{
String userName;
String userPass;
public UserInfo(){
}
public UserInfo(String userName, String userPass){
userName=this.userName;
userPass=this.userPass;
}
public void setUserName(String userName){
this.userName=userName;
}
public void setUserPass(String userPass){
this.userPass=userPass;
}
}
this.userName
指向那个class的局部变量userName
不是接收到的参数。
最初这些都是空的,
String userName;
String userPass;
这里是你出错的地方。
public void setUserName(String userName){
userName=this.userName; // assume userName u passed was admin, then, admin = userName where userName is empty which causes null pointer exception
}
所以,应该是
public void setUserName(String userName){
this.userName=userName; //in this case userName = admin;
}
您还需要为 class 中的整个事物更改相同的分配事物。所以,class 的最终代码应该是
public class UserInfo
{
String userName;
String userPass;
public UserInfo(){
}
public UserInfo(String userName, String userPass){
this.userName= userName;
this.userPass = userPass;
}
public void setUserName(String userName){
this.userName= userName;
}
public void setUserPass(String userPass){
this.userPass = userPass;
}
}
下面是class代码:
public class UserInfo
{
String userName;
String userPass;
public UserInfo(){
}
public UserInfo(String userName, String userPass){
userName=this.userName;
userPass=this.userPass;
}
public void setUserName(String userName){
userName=this.userName;
}
public void setUserPass(String userPass){
userPass=this.userPass;
}
}
如果我将字符串从 activity 传递给对象函数,如下所示:userInfo.setUserName(et_login_user_name.getText().toString());
那么用户名没有设置为编辑框的值。它被设置为空。
但是如果我设置值如下:
userInfo.userName=et_login_user_name.getText().toString();
然后代码可以正常工作。
下面是activityclass代码:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
final Context ctx=this;
final Button bt_login=(Button)findViewById(R.id.button5);
bt_login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
UserInfo userInfo = new UserInfo();
EditText et_login_user_name=(EditText)findViewById(R.id.editText);
EditText et_login_user_pass=(EditText)findViewById(R.id.editText2);
// userInfo.setUserName(et_login_user_name.getText().toString()); -not working
// userInfo.setUserPass(et_login_user_pass.getText().toString()); -not working
userInfo.userName=et_login_user_name.getText().toString(); // working
userInfo.userPass=et_login_user_pass.getText().toString(); // working
if(userInfo.userPass.isEmpty()||userInfo.userName.isEmpty()) //get null pointer exception for non working code
{
//some code
}
您分配的值不正确,您没有将值分配给 class 成员,而是将 class 成员值分配给传递的参数。即代替 用户名 = this.userName 使用
this.userName = 用户名;
使用这个,您可以从 class 变量中为局部函数变量赋值。下面的代码现在适合你
public class UserInfo
{
String userName;
String userPass;
public UserInfo(){
}
public UserInfo(String userName, String userPass){
userName=this.userName;
userPass=this.userPass;
}
public void setUserName(String userName){
this.userName=userName;
}
public void setUserPass(String userPass){
this.userPass=userPass;
}
}
this.userName
指向那个class的局部变量userName
不是接收到的参数。
最初这些都是空的,
String userName;
String userPass;
这里是你出错的地方。
public void setUserName(String userName){
userName=this.userName; // assume userName u passed was admin, then, admin = userName where userName is empty which causes null pointer exception
}
所以,应该是
public void setUserName(String userName){
this.userName=userName; //in this case userName = admin;
}
您还需要为 class 中的整个事物更改相同的分配事物。所以,class 的最终代码应该是
public class UserInfo
{
String userName;
String userPass;
public UserInfo(){
}
public UserInfo(String userName, String userPass){
this.userName= userName;
this.userPass = userPass;
}
public void setUserName(String userName){
this.userName= userName;
}
public void setUserPass(String userPass){
this.userPass = userPass;
}
}