Java 无法为变量赋值

Java 无法为变量赋值,java,android,parse-platform,Java,Android,Parse Platform,我是一个新的android开发者,我面临着一个奇怪的问题。我试图创建一个简单的验证测试来定义输入是否有效,用户名是否不在美国,或者相反。我尝试了各种方法,比如创建一个静态bollean'isValid'变量并赋值,或者使用setValid()之类的方法来赋值,但似乎没有任何效果 我确信代码正在被处理(调试),但没有任何变化,它被固定为false 请与我分享你的智慧 public class Registration extends Fragment { public boolean is

我是一个新的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();
                }
            }

        });

    }
}
公共类注册扩展片段{
公共布尔值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();
}