Fix Android (Studio ) Login Aktivitätsvorlage erzeugt Aktivität

? Cedric Simon @ | Original: StackOverFlow
---

Ich wollte ein Login-Formular in meiner app zu implementieren, so dass ich versuchte, die von der Android- Studio -Assistenten generierten Code für eine neue Aktivität des Typs Login Form verwenden . Ich denke, dass die Eclipse generierten Code ist fast das gleiche .

Leider hat der generierte Code nicht zum gewünschten Ergebnis geführt : ich ein schönes einfaches Anmeldeformular erstellt, aber mit der richtigen oder falschen Passworts, es nicht aus dem Anmeldeformular zu bewegen.

Auch bemerkte ich, dass kein "Registrieren" Form erstellt wurde.

Nachdem ich ein bisschen, und die Analyse der Code, ich habe es endlich funktioniert :)

Siehe meine Antwort unten.

---

Top 5 Antwort

1Cedric Simon @ Step 1: Make Login succesfull and advance to main activity

Um die Anmeldetätigkeithaben zu versagen, wenn falsche Benutzer / Passwort verwendet wird, und zu Hauptaktivität, wenn erfolgreich, müssen Sie die folgenden Änderungen an den generierten Code zu machen :

AndroidManifest.xml:

Bewegen Sie den folgenden Code aus Sie Haupttätigkeit auf die LoginActivity Abschnitt :

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

Bearbeiten Sie dann die LoginActivity.java und tun die folgenden Änderungen:

Inside doInBackground Methode, am Ende ersetzen Sie den Rückgabewert von true auf 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;
}

Dann auf der onPostExecute Methode, eine neue Absicht nach dem 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();
    }
}

Jetzt anmelden shoul mit einer der folgenden Benutzer DBE succesfull : Passwort foo@example.com : hallo bar@example.com : Welt

Andere Benutzer : Passwort sollte versuchen falsches Passwort angeben und bleiben Sie auf Login-Seite .

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

Wir haben jetzt erhalten Einloggen Infos aus der Datenbank ( SQLite ) anstelle von statischen Variablen . Dies wird es uns ermöglichen, mehr als 1 auf dem Gerät registriert haben .

Erstellen Sie zunächst eine neue User.java Klasse:

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;
    }

}

Dann erstellen oder aktualisieren Sie Ihre SQLite -Helfer ( DBTools.java in meinem Fall) Klasse :

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);
              recreateDb(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;
    }
}

Hinweis: DB_VERSION wird verwendet, um Up- / Downgrade des DB-Schema zu erkennen ; )

Dann ändern Sie die LoginActivity, Java wie folgt:

Fügen Sie die folgenden Importe :

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

Fügen Sie eine neue Variable :

private User myUser;

Entfernen DUMMY_CREDENTIALS Variablendeklaration .

In Verfahren attemptLogin, fügen Kontext beim Aufruf UserLoginTask :

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

Tauschen Sie die interne UserLoginTask Klasse mit dem fiolloing Code:

/**
     * 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();
        }
    }

    @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:

<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>

Ich hoffe, ich habe nichts vergessen ... Es funktionierte gut für mich : D

Wenn E-Mail ist nicht vorhanden in DB, wird sie vorschlagen, um sie zu registrieren, E-Mail überprüfen, ansonsten gegenüber dem Passwort.

Viel Spaß mit Android : D