0

这适用于 CREDENTIALS 中的默认字符串,但我不知道如何实现注册过程,如何将这些 mEmail 和 mPassword 添加到 CREDENTIALS 字符串?该模板在 AsyncTask 中有一个 TODO register the new account here 提示。

public class LoginActivity extends Activity 
{
/**
* A dummy authentication store containing known user names and passwords.
* TODO: remove after connecting to a real authentication system.
*/
//
//before
//private static final String[] CREDENTIALS = new String[] 
//   {
//    "myaccount1@gmail.com:12345", "myaccount2@gmail.com:54321" 
//    };
//after
ArrayList<String> CREDENTIALS = new ArrayList<String>(Arrays.asList("myaccount1@gmail.com:12345","myaccount2@gmail.com:54321"));

/**
* The default email to populate the email field with.
*/
public static final String EXTRA_EMAIL = "myaccount1@gmail.com";

/**
* Keep track of the login task to ensure we can cancel it if requested.
*/
private UserLoginTask mAuthTask = null;

// Values for email and password at the time of the login attempt.
private String mEmail;
private String mPassword;

// UI references.
private EditText mEmailView;
private EditText mPasswordView;
private View mLoginFormView;
private View mLoginStatusView;
private TextView mLoginStatusMessageView;

@Override
protected void onCreate(Bundle savedInstanceState) 
{
super.onCreate(savedInstanceState);

setContentView(R.layout.activity_login);

// Set up the login form.
mEmail = getIntent().getStringExtra(EXTRA_EMAIL);
mEmailView = (EditText) findViewById(R.id.email);
mEmailView.setText(mEmail);

mPasswordView = (EditText) findViewById(R.id.password);
mPasswordView
        .setOnEditorActionListener(new TextView.OnEditorActionListener() 
        {
            @Override
            public boolean onEditorAction(TextView textView, int id,
                    KeyEvent keyEvent) 
            {
                if (id == R.id.login || id == EditorInfo.IME_NULL) 
                {
                    attemptLogin();
                    return true;
                }
                return false;
            }
        });

mLoginFormView = findViewById(R.id.login_form);
mLoginStatusView = findViewById(R.id.login_status);
mLoginStatusMessageView = (TextView) findViewById(R.id.login_status_message);

findViewById(R.id.sign_in_button).setOnClickListener(
        new View.OnClickListener() 
        {
            @Override
            public void onClick(View view) 
            {
                attemptLogin();
            }
        });
}

@Override
public boolean onCreateOptionsMenu(Menu menu) 
{
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.activity_login, menu);
return true;
}

/**
 * Attempts to sign in or register the account specified by the login form.
 * If there are form errors (invalid email, missing fields, etc.), the
 * errors are presented and no actual login attempt is made.
 */
public void attemptLogin() 
{
if (mAuthTask != null) 
{
    return;
}

// Reset errors.
mEmailView.setError(null);
mPasswordView.setError(null);

// Store values at the time of the login attempt.
mEmail = mEmailView.getText().toString();
mPassword = mPasswordView.getText().toString();

boolean cancel = false;
View focusView = null;

// Check for a valid password.
if (TextUtils.isEmpty(mPassword)) 
{
    mPasswordView.setError(getString(R.string.error_field_required));
    focusView = mPasswordView;
    cancel = true;
} else if (mPassword.length() < 4) 
{
    mPasswordView.setError(getString(R.string.error_invalid_password));
    focusView = mPasswordView;
    cancel = true;
}

// Check for a valid email address.
if (TextUtils.isEmpty(mEmail)) 
{
    mEmailView.setError(getString(R.string.error_field_required));
    focusView = mEmailView;
    cancel = true;
} else if (!mEmail.contains("@")) 
{
    mEmailView.setError(getString(R.string.error_invalid_email));
    focusView = mEmailView;
    cancel = true;
}

if (cancel) 
{
    // There was an error; don't attempt login and focus the first
    // form field with an error.
    focusView.requestFocus();
} else 
{
    // Show a progress spinner, and kick off a background task to
    // perform the user login attempt.
    mLoginStatusMessageView.setText(R.string.login_progress_signing_in);
    showProgress(true);
    mAuthTask = new UserLoginTask();
    mAuthTask.execute((Void) null);
}
}

/**
* Shows the progress UI and hides the login form.
*/
@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
private void showProgress(final boolean show) 
{
// On Honeycomb MR2 we have the ViewPropertyAnimator APIs, which allow
// for very easy animations. If available, use these APIs to fade-in
// the progress spinner.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) 
{
    int shortAnimTime = getResources().getInteger(
            android.R.integer.config_shortAnimTime);

    mLoginStatusView.setVisibility(View.VISIBLE);
    mLoginStatusView.animate().setDuration(shortAnimTime)
            .alpha(show ? 1 : 0)
            .setListener(new AnimatorListenerAdapter() 
            {
                @Override
                public void onAnimationEnd(Animator animation) 
                {
                    mLoginStatusView.setVisibility(show ? View.VISIBLE
                            : View.GONE);
                }
            });

    mLoginFormView.setVisibility(View.VISIBLE);
    mLoginFormView.animate().setDuration(shortAnimTime)
            .alpha(show ? 0 : 1)
            .setListener(new AnimatorListenerAdapter() 
            {
                @Override
                public void onAnimationEnd(Animator animation) 
                {
                    mLoginFormView.setVisibility(show ? View.GONE
                            : View.VISIBLE);
                }
            });
} else 
{
    // The ViewPropertyAnimator APIs are not available, so simply show
    // and hide the relevant UI components.
    mLoginStatusView.setVisibility(show ? View.VISIBLE : View.GONE);
    mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE);
}
}

/**
 * Represents an asynchronous login/registration task used to authenticate
 * the user.
 */
public class UserLoginTask extends AsyncTask<Void, Void, Boolean> 
{
@Override
protected Boolean doInBackground(Void... params) 
{
    // TODO: attempt authentication against a network service.

    try 
    {
        // Simulate network access.
        Thread.sleep(2000);
    } catch (InterruptedException e) 
    {
        return false;
    }

    for (String credential : CREDENTIALS) 
    {
        String[] pieces = credential.split(":");
        if (pieces[0].equals(mEmail)) 
        {
            // Account exists, return true if the password matches.
            return pieces[1].equals(mPassword);
        }
    }

    // TODO: register the new account here.
    CREDENTIALS.add(mEmail+":"+mPassword);
    return true;
}

@Override
protected void onPostExecute(final Boolean success) 
{
    mAuthTask = null;
    showProgress(false);

    if (success) 
    {
        finish();
        Intent myIntent = new Intent(LoginActivity.this,CalculatorActivity.class);
        LoginActivity.this.startActivity(myIntent);
    } else 
    {
        mPasswordView
                .setError(getString(R.string.error_incorrect_password));
        mPasswordView.requestFocus();
    }
}

@Override
protected void onCancelled() 
{
    mAuthTask = null;
    showProgress(false);
}
}
4

1 回答 1

0

在这里,你使用了 String[] CREDENTIALS。字符串数组是最终的并已声明。因此您需要使用字符串的 ArrayList 而不是字符串数组。

然后你可以将你的文本从 mEmailView 和 mPasswordView 中附加“:”。现在将此新字符串添加到您的 Arraylist CREDENTIALS。

于 2013-07-02T06:51:03.773 回答