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

我想在我的应用程序中实现一个登录表单,所以我尝试使用Android Studio向导生成的代码来创建一个types为Login Form的新Activity。 我认为Eclipse生成的代码几乎是一样的。

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

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

看了一下,然后分析代码,我终于明白了:)

请参阅下面的回复。

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

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

AndroidManifest.xml

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

     

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

doInBackground方法中,最后将返回值从true替换为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; } 

然后在onPostExecute方法中,在finish();之后添加一个新的intent 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(); } } 

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

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

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

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

首先,创建一个新的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; } } 

然后创建或更新您的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; } } 

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

然后修改LoginActivity.java,如下所示:

添加以下导入:

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

添加一个新variables:

 private User myUser; 

删除DUMMY_CREDENTIALSvariables声明。

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

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

使用以下代码替换内部UserLoginTask类:

 /** * Represents an asynchronous login/registration task used to authenticate * the user. */ public class UserLoginTask extends AsyncTask { 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); } } 

strings.xml ,添加:

 Email not found. You want to create a new user with that email and password? Yes No 

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

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

玩得开心:D