[英]Unable to assign value to variable
我是一名相当新的android开发人员,并且面临一个奇怪的问题。 我正在尝试创建一个简单的验证测试,以定义输入是否有效而用户名不在我们之内,或者相反。 我尝试了很多类似的事情,例如创建一个静态的bollean'isValid'变量并对其进行分配,或者使用诸如setValid()之类的方法对其进行分配,但似乎没有任何作用。
我确定代码正在处理(调试),但没有任何变化,它停留在false上。
请和我分享你的智慧。
public class Registration extends Fragment {
public boolean isValid=false;
public Registration() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View rootView = inflater.inflate(R.layout.registration, container,
false);
return rootView;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
Button bDone = (Button) getActivity().findViewById(R.id.bDone);
bDone.setOnClickListener(new View.OnClickListener() {
// pressed when finished entering personal details
@Override
public void onClick(View v) {
final EditText fName = (EditText) getActivity().findViewById(R.id.etFirstName);
final EditText lName = (EditText) getActivity().findViewById(R.id.etLastName);
final EditText id = (EditText) getActivity().findViewById(R.id.etID);
final EditText email = (EditText) getActivity().findViewById(R.id.etEmail);
final EditText uName = (EditText) getActivity().findViewById(R.id.etRegUsername);
final EditText pWord = (EditText) getActivity().findViewById(R.id.etRegPassword);
ParseQuery<ParseObject> query = ParseQuery.getQuery("Account");
String emailPattern = "[a-zA-Z0-9._-]+@[a-z]+\\.+[a-z]+";
String emailAddress;
ParseObject dsAccount = new ParseObject("Account");
dsAccount.put("firstName", fName.getText().toString());
dsAccount.put("lastName", lName.getText().toString());
dsAccount.put("ID", id.getText().toString());
dsAccount.put("Email", email.getText().toString());
dsAccount.put("username", uName.getText().toString());
dsAccount.put("password", pWord.getText().toString());
emailAddress = email.getText().toString();
if (fName.getText().toString().length() == 0
|| lName.getText().toString().length() == 0
|| id.getText().toString().length() == 0
|| email.getText().toString().length() == 0
|| uName.getText().toString().length() == 0
|| pWord.getText().toString().length() == 0) {
// at least one of the fields is empty
Toast.makeText(getActivity().getApplicationContext(),"One or more fields are missing",Toast.LENGTH_SHORT).show();
} else if (!emailAddress.matches(emailPattern)) {
// email address not valid
Toast.makeText(getActivity().getApplicationContext(),"Invalid email address", Toast.LENGTH_SHORT).show();
} else {
// email address valid
query.whereEqualTo("username", uName.getText().toString());
query.whereEqualTo("password", pWord.getText().toString());
query.getFirstInBackground(new GetCallback<ParseObject>() {
public void done(ParseObject Account, ParseException e) {
if (Account == null) {
isValid=true;//***this is the code that doesnt happen**
} else {
Toast.makeText(getActivity().getApplicationContext(),"Username is already in use",Toast.LENGTH_SHORT).show();
}
}
});
}
if (isValid){//**this is the code that supposed to respond**
dsAccount.saveInBackground();
Toast.makeText(getActivity().getApplicationContext(),"New account saved", Toast.LENGTH_SHORT).show();
}
}
});
}
}
您发布的代码段的问题在于query.getFirstInBackground
是在后台执行的,并且在调用done
时您会检查isValid值。 所以你可能想执行
dsAccount.saveInBackground();
Toast.makeText(getActivity().getApplicationContext(),"New account saved", Toast.LENGTH_SHORT).show();
done(ParseObject Account, ParseException e) {
而不是设置标志。 另外,只有UI线程可以触摸ui
由于您使用的是异步方法getFirstInBackground
,因此无法按顺序使用代码,就像您在此处尝试这样做一样。 getFirstInBackground
方法在另一个线程上触发,然后继续执行-因此,本质上来说, if
检查isValid
语句触发得太早了。 将这部分代码放入异步调用中,如下所示:
query.getFirstInBackground(new GetCallback<ParseObject>() {
public void done(ParseObject Account, ParseException e) {
if (Account == null) {
isValid=true;//***this is the code that doesnt happen**
dsAccount.saveInBackground();
makeAToast("New account saved", mActivity); // Explained down below
} else {
makeAToast("Username is already in use", mActivity);
}
}
});
并将context
作为类context
的全局变量,例如Context context = this
在调用onCreate()
之前。 同样,以相同的方式创建一个Activity
类型变量: Activity mActivity = this
。
因为您不能调用Toast
,它是非UI线程中的一个UI组件(因为您要保存在后台线程中),请尝试执行以下操作:
public void makeAToast(String inText, Activity myActivity) {
new Thread()
{
public void run()
{
myActivity.this.runOnUiThread(new Runnable()
{
public void run()
{
Toast.makeText(context,inText, Toast.LENGTH_SHORT).show();
}
});
}
}.start();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.