繁体   English   中英

无法为变量分配值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM