Java 无法为变量赋值
我是一个新的android开发者,我面临着一个奇怪的问题。我试图创建一个简单的验证测试来定义输入是否有效,用户名是否不在美国,或者相反。我尝试了各种方法,比如创建一个静态bollean'isValid'变量并赋值,或者使用setValid()之类的方法来赋值,但似乎没有任何效果 我确信代码正在被处理(调试),但没有任何变化,它被固定为false 请与我分享你的智慧Java 无法为变量赋值,java,android,parse-platform,Java,Android,Parse Platform,我是一个新的android开发者,我面临着一个奇怪的问题。我试图创建一个简单的验证测试来定义输入是否有效,用户名是否不在美国,或者相反。我尝试了各种方法,比如创建一个静态bollean'isValid'变量并赋值,或者使用setValid()之类的方法来赋值,但似乎没有任何效果 我确信代码正在被处理(调试),但没有任何变化,它被固定为false 请与我分享你的智慧 public class Registration extends Fragment { public boolean is
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();
}
}
});
}
}
公共类注册扩展片段{
公共布尔值isValid=false;
公开注册(){
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
//TODO自动生成的方法存根
视图根视图=充气机充气(右布局、注册、容器、,
假);
返回rootView;
}
@凌驾
已创建ActivityState上的公共无效(Bundle savedInstanceState){
//TODO自动生成的方法存根
super.onActivityCreated(savedInstanceState);
按钮bDone=(按钮)getActivity().findViewById(R.id.bDone);
setOnClickListener(新视图.OnClickListener(){
//完成输入个人详细信息时按下
@凌驾
公共void onClick(视图v){
final EditText fName=(EditText)getActivity().findViewById(R.id.etFirstName);
final EditText lName=(EditText)getActivity().findViewById(R.id.etLastName);
最终EditText id=(EditText)getActivity().findViewById(R.id.etID);
最终EditText电子邮件=(EditText)getActivity().findViewById(R.id.etEmail);
最终EditText uName=(EditText)getActivity().findViewById(R.id.etRegUsername);
最终EditText pWord=(EditText)getActivity().findViewById(R.id.etRegPassword);
ParseQuery=ParseQuery.getQuery(“账户”);
字符串emailPattern=“[a-zA-Z0-9.\u-]+@[a-z]+\.+[a-z]+”;
字符串电子邮件地址;
ParseObject dsAccount=新的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(“用户名”,uName.getText().toString());
dsAccount.put(“密码”,pWord.getText().toString());
emailAddress=email.getText().toString();
如果(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){
//至少有一个字段为空
Toast.makeText(getActivity().getApplicationContext(),“缺少一个或多个字段”,Toast.LENGTH_SHORT).show();
}如果(!emailAddress.matches(emailPattern)){
//电子邮件地址无效
Toast.makeText(getActivity().getApplicationContext(),“无效电子邮件地址”,Toast.LENGTH\u SHORT).show();
}否则{
//电子邮件地址有效
query.whereEqualTo(“用户名”,uName.getText().toString());
query.whereEqualTo(“密码”,pWord.getText().toString());
getFirstInBackground(新的GetCallback(){
公共作废完成(ParseObject帐户,Parsee异常){
如果(帐户==null){
isValid=true;//***这是不会发生的代码**
}否则{
Toast.makeText(getActivity().getApplicationContext(),“用户名已在使用”,Toast.LENGTH\u SHORT.show();
}
}
});
}
如果(isValid){/**这是应该响应的代码**
dsAccount.saveInBackground();
Toast.makeText(getActivity().getApplicationContext(),“新帐户已保存”,Toast.LENGTH\u SHORT.show();
}
}
});
}
}
您发布的代码片段的问题是查询.getFirstInBackground
在后台执行,并且在调用完成时检查isValid值。所以你可能想要执行
dsAccount.saveInBackground();
Toast.makeText(getActivity().getApplicationContext(),"New account saved", Toast.LENGTH_SHORT).show();
当完成时(ParseObject帐户,parsee异常){
被调用,而不是设置标志。此外,只有UI线程可以触摸UI,因为您使用的是异步方法getFirstInBackground
,您不能像在这里尝试的那样顺序使用代码。getFirstInBackground
方法在另一个线程上激发,然后继续执行-所以essen通常,如果检查是否有效的语句触发得太早,则会触发。将这部分代码放入异步调用中,如下所示:
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);
}
}
});
问题可能在于if(Account==null){。我的意思是这个“Account”是什么您正在比较的?我正在尝试在数据库中查找用户名,以防止覆盖它。帐户是我数据库中的一个对象,感谢krodmannix提供了很好的答案!!感谢您的回答。我确实尝试过使用您的代码,但我不太理解它的第二部分,即MakeToos方法。myactivity.this.rununui到底是什么线程?即使用getActivity()替换myactivity.this,Eclipse也无法识别它。您了解异步部分吗?此方法必须存在的原因是
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();
}