示例与说明:Android(Studio)登录活动模板生成的活动

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/22209046/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 05:38:36  来源:igfitidea点击:

Example and explanation: Android (Studio) Login Activity Template generated activity

androidloginandroid-styles

提问by Cedric Simon

I wanted to implement a login form in my app, so I tried to use the code generated by the Android Studio Wizard for a new Activity of type Login Form. i think that the code generated by Eclipse is almost the same.

我想在我的应用程序中实现一个登录表单,所以我尝试使用 Android Studio 向导生成的代码来创建一个新的登录表单类型的活动。我认为Eclipse生成的代码几乎相同。

Unfortunately, the generated code did not provide the expected result: I created a nice simple login form, but with correct or wrong password, it does not move from the login form.

不幸的是,生成的代码没有提供预期的结果:我创建了一个不错的简单登录表单,但是密码正确或错误,它不会从登录表单中移出。

Also I noticed that no "Register" form was created.

我还注意到没有创建“注册”表单。

After looking a bit, and analyzing the code, I finally got it working :)

看了一会儿,分析了代码,我终于让它工作了:)

See my response below.

看我下面的回复。

回答by Cedric Simon

Step 1: Make Login successful and advance to main activity

第 1 步:使登录成功并进入主要活动

To have the login activity to fail when wrong user/password is used, and go to main activity when successful, you need to make the following corrections to the generated code:

为了在使用错误的用户/密码时登录活动失败,并在成功时转到主活动,您需要对生成的代码进行以下更正:

AndroidManifest.xml:

AndroidManifest.xml

Move the following code from you main activity to the LoginActivity section:

将以下代码从您的主要活动移至 LoginActivity 部分:

<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

Then edit the LoginActivity.javaand do the following changes:

然后编辑LoginActivity.java并进行以下更改:

Inside doInBackgroundmethod, at the end replace the returned value from trueto false

doInBackground方法内部,最后将返回值从trueto替换为false

@Override
protected Boolean doInBackground(Void... params) {
    for (String credential : DUMMY_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.
    return false;
}

Then on the onPostExecutemethod, add a new intent after the finish();:

然后在onPostExecute方法上,在 之后添加一个新的意图finish();

@Override
protected void onPostExecute(final Boolean success) {
    mAuthTask = null;
    showProgress(false);
    if (success) {
        finish();
        Intent myIntent = new Intent(LoginActivity.this,MyMainActivity.class);
        LoginActivity.this.startActivity(myIntent);
    } else {
        mPasswordView.setError(getString(R.string.error_incorrect_password));
        mPasswordView.requestFocus();
    }
}

Now login should be successful using one of the following user:passwordcredentials:

现在登录应该使用以下user:password凭据之一成功:

Other user:passwordtry should state incorrect password and stay on Login page.

其他user:password尝试应该说明密码不正确并停留在登录页面。

Step 2: Allow registration, store login into the database and check credentials vs DB

第 2 步:允许注册,将登录信息存储到数据库中并检查凭据与数据库

We now will get Login info from database (SQLite) instead of static variable. This will allow us to have more than 1 user registered on the device.

我们现在将从数据库(SQLite)而不是静态变量中获取登录信息。这将允许我们在设备上注册超过 1 个用户。

First, create a new User.javaclass:

首先,创建一个新User.java类:

package com.clinsis.onlineresults.utils;

/**
 * Created by csimon on 5/03/14.
 */
public class User {
    public long userId;
    public String username;
    public String password;

    public User(long userId, String username, String password){
        this.userId=userId;
        this.username=username;
        this.password=password;
    }

}

Then create or update your SQLite helper (DBTools.javain my case) class:

然后创建或更新您的 SQLite 助手(DBTools.java在我的例子中)类:

package com.clinsis.onlineresults.utils;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
 * Created by csimon on 12/11/13.
 */
public class DBTools extends SQLiteOpenHelper {

    private final static int    DB_VERSION = 10;

    public DBTools(Context context) {
        super(context, "myApp.db", null,DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        String query = "create table logins (userId Integer primary key autoincrement, "+
                          " username text, password text)";
                  sqLiteDatabase.execSQL(query);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
          try{
              System.out.println("UPGRADE DB oldVersion="+oldVersion+" - newVersion="+newVersion);
              onCreate(sqLiteDatabase);
              if (oldVersion<10){
                  String query = "create table logins (userId Integer primary key autoincrement, "+
                          " username text, password text)";
                  sqLiteDatabase.execSQL(query);
              }
            }
        catch (Exception e){e.printStackTrace();}
    }

    @Override
    public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
       // super.onDowngrade(db, oldVersion, newVersion);
        System.out.println("DOWNGRADE DB oldVersion="+oldVersion+" - newVersion="+newVersion);
    }

    public User insertUser (User queryValues){
        SQLiteDatabase database = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("username", queryValues.username);
        values.put("password", queryValues.password);
        queryValues.userId=database.insert("logins", null, values);
        database.close();
        return queryValues;
    }

    public int updateUserPassword (User queryValues){
        SQLiteDatabase database = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("username", queryValues.username);
        values.put("password", queryValues.password);
        queryValues.userId=database.insert("logins", null, values);
        database.close();
        return database.update("logins", values, "userId = ?", new String[] {String.valueOf(queryValues.userId)});
    }

    public User getUser (String username){
        String query = "Select userId, password from logins where username ='"+username+"'";
        User myUser = new User(0,username,"");
        SQLiteDatabase database = this.getReadableDatabase();
        Cursor cursor = database.rawQuery(query, null);
        if (cursor.moveToFirst()){
            do {
                myUser.userId=cursor.getLong(0);
                myUser.password=cursor.getString(1);
            } while (cursor.moveToNext());
        }
        return myUser;
    }
}

Note: DB_VERSIONis used to detect upgrade/downgrade of the DB schema ;)

注意:DB_VERSION用于检测数据库架构的升级/降级;)

Then modify the LoginActivity.java as follow:

然后修改 LoginActivity.java 如下:

Add the following imports:

添加以下导入:

import android.widget.Toast;
import com.clinsis.onlineresults.utils.DBTools;
import com.clinsis.onlineresults.utils.User;

Add a new variable:

添加一个新变量:

private User myUser;

Remove DUMMY_CREDENTIALSvariable declaration.

删除DUMMY_CREDENTIALS变量声明。

In attemptLoginmethod, add context when calling UserLoginTask:

attemptLogin方法中,调用时添加上下文UserLoginTask

mAuthTask = new UserLoginTask(email, password, this);

Replace the internal UserLoginTask class with the following code:

将内部 UserLoginTask 类替换为以下代码:

/**
     * Represents an asynchronous login/registration task used to authenticate
     * the user.
     */
public class UserLoginTask extends AsyncTask<Void, Void, Boolean> {

    private final String mEmail;
    private final String mPassword;
    private final Context mContext;

    UserLoginTask(String email, String password, Context context) {
        mEmail = email;
        mPassword = password;
        mContext= context;
    }

    @Override
    protected Boolean doInBackground(Void... params) {
        DBTools dbTools=null;
        try{
            dbTools = new DBTools(mContext);
            myUser = dbTools.getUser(mEmail);

            if (myUser.userId>0) {
                // Account exists, check password.
                if (myUser.password.equals(mPassword))
                    return true;
                else
                    return false;
            } else {
                myUser.password=mPassword;
                return true;
        }
        } finally{
            if (dbTools!=null)
                dbTools.close();
        }
        // return false if no previous checks are true
        return false;
    }

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

        if (success) {
            if (myUser.userId>0){
                finish();
                Intent myIntent = new Intent(LoginActivity.this,ReportListActivity.class);
                LoginActivity.this.startActivity(myIntent);
            } else {
                DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        switch (which){
                            case DialogInterface.BUTTON_POSITIVE:
                                DBTools dbTools=null;
                                try{
                                    finish();
                                    dbTools = new DBTools(mContext);
                                    myUser=dbTools.insertUser(myUser);
                                    Toast myToast = Toast.makeText(mContext,R.string.updatingReport, Toast.LENGTH_SHORT);
                                    myToast.show();
                                    Intent myIntent = new Intent(LoginActivity.this,ReportListActivity.class);
                                    LoginActivity.this.startActivity(myIntent);
                                } finally{
                                    if (dbTools!=null)
                                        dbTools.close();
                                }
                                break;

                            case DialogInterface.BUTTON_NEGATIVE:
                                mPasswordView.setError(getString(R.string.error_incorrect_password));
                                mPasswordView.requestFocus();
                                break;
                        }
                    }
                };

                AlertDialog.Builder builder = new AlertDialog.Builder(this.mContext);
                builder.setMessage(R.string.confirm_registry).setPositiveButton(R.string.yes, dialogClickListener)
                        .setNegativeButton(R.string.no, dialogClickListener).show();
            }
        } else {
            mPasswordView.setError(getString(R.string.error_incorrect_password));
            mPasswordView.requestFocus();
        }
    }

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

In strings.xml, add:

strings.xml,添加:

<string name="confirm_registry">Email not found. You want to create a new user with that email and password?</string>
<string name="yes">Yes</string>
<string name="no">No</string>

I hope I did not forget anything... It worked fine for me :D

我希望我没有忘记任何事情......它对我来说很好:D

If email is not present in the DB, it will propose to register it, otherwise it will check the email versus the password.

如果数据库中不存在电子邮件,它将建议注册它,否则它将检查电子邮件与密码。

Have fun with Android :D

玩得开心安卓 :D