欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基于eclipse的android项目实战—博学谷(三)登录界面

程序员文章站 2022-05-16 20:25:34
...
本项目是用eclipse软件编写,经过我的亲自实践,其真实有效,希望能给您有所帮助????????
项目版本:android4.0
AVD建议:android4.4及以上

登录界面主要用于输入登录信息,当点击“登录”按钮时需要在 Shared Preferences中查询输入的用户名是否有对应的密码,如果有则用此密码与当前输入的密码(需MD5加密)进行比对,如果信息一致,则登录成功,并把登录成功的状态和用户名保存到Sharedpreferences中,便于后续判断登录状态和获取用户名。如果登录失败,则有两种情况:一种是输入的用户名和密码不匹配:另一种是此用户名不存在。

效果图:

基于eclipse的android项目实战—博学谷(三)登录界面

1.登录界面布局文件activity_login.xml

在该布局文件中,通过标签将main_title_bar.xml(标题栏)引入。
代码如下:activity_login.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/register_bg"
    android:orientation="vertical" >
    
    <include layout="@layout/main_title_bar"/>
    
    <ImageView 
        android:id="@+id/iv_head"
        android:layout_marginTop="25dp"
        android:layout_gravity="center_horizontal"
        android:contentDescription="@null"
        android:src="@drawable/default_icon"
        android:layout_width="70dp"
        android:layout_height="70dp"/>
    
    <EditText 
        android:singleLine="true"
        android:id="@+id/et_user_name"
        android:layout_width="fill_parent"
        android:layout_height="48dp"
        android:background="@drawable/register_psw"
        android:layout_marginTop="35dp"
        android:layout_marginLeft="35dp"
        android:layout_marginRight="35dp"
        android:drawableLeft="@drawable/user_name_icon"
        android:paddingLeft="8dp"
        android:drawablePadding="10dp"
        android:hint="@string/name"
        android:gravity="center_vertical"
        android:textColorHint="#a3a3a3"
        android:textColor="#000000"
        android:textSize="14sp"/>
    
    <EditText 
        android:singleLine="true"
        android:id="@+id/et_pwd"
        android:layout_width="fill_parent"
        android:layout_height="48dp"
        android:background="@drawable/register_psw"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="35dp"
        android:layout_marginRight="35dp"
        android:drawableLeft="@drawable/psw_icon"
        android:paddingLeft="8dp"
        android:drawablePadding="10dp"
        android:inputType="textPassword"
        android:hint="@string/pwd"
        android:gravity="center_vertical"
        android:textColorHint="#a3a3a3"
        android:textColor="#000000"
        android:textSize="14sp"/>
    
    <Button
        android:text="@string/login"
        android:id="@+id/btn_login"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="15dp"
        android:layout_marginLeft="35dp"
        android:layout_marginRight="35dp"
        android:textColor="@android:color/white"
        android:textSize="20sp"
        android:textStyle="bold"
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:background="@drawable/register_selector"/>
    
    <LinearLayout 
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_marginTop="8dp"
        android:layout_marginLeft="35dp"
        android:layout_marginRight="35dp"
        android:gravity="center_horizontal"
        android:orientation="horizontal">
        
        <TextView 
            android:id="@+id/tv_register"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center_horizontal"
            android:padding="8dp"
            android:text="@string/tv_register"
            android:textColor="@android:color/white"
            android:textSize="14sp"/><!--layout_weight="1" layout_width="0dp"实现均分效果-->
        
        <TextView 
            android:id="@+id/tv_find_pwd"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center_horizontal"
            android:padding="8dp"
            android:text="@string/find_pwd"
            android:textColor="@android:color/white"
            android:textSize="14sp"/>
    </LinearLayout>

</LinearLayout>

2.登录界面逻辑代码

当点击“登录”按钮时,需要先判断用户名和密码是否为空,若为空则提示请输入用户名和密码;若不为空则获取用户输入的用户名,由于博学谷项目用的是本地数据,因此根据用户名在 Sharedpreferences中查询是否有对应的密码,如果有对应的密码并且与用户输入的密码(需MD5加密)比对一致,则登录成功。

新建类LoginActivity:在包china.ynyx.heyunhui.activity中,右击并选择“New”–“class”,新建LoginActivity.java文件
基于eclipse的android项目实战—博学谷(三)登录界面
代码如下:LoginActivity.java

package china.ynyx.heyunhui.activity;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import china.ynyx.heyunhui.MainActivity;
import china.ynyx.heyunhui.R;
import china.ynyx.heyunhui.utils.MD5Utils;
import china.ynyx.heyunhui.activity.LoginActivity;

public class LoginActivity extends Activity {

	private TextView tv_main_title;//标题
    private TextView tv_back;		//返回按钮
    private TextView tv_register,tv_find_pwd;//立即注册、找回密码的控件
    private Button btn_login;	//登录按钮
    private EditText et_user_name,et_pwd;//用户名、密码的控件
    private String username,pwd,spPwd;//用户名、密码的控件的获取值
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    	// TODO Auto-generated method stub
    	super.onCreate(savedInstanceState);
    	setContentView(R.layout.activity_login);
    	//设置此界面为竖屏
    	setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    	init();
    }

	private void init() {
		// TODO Auto-generated method stub
		tv_main_title=(TextView)findViewById(R.id.tv_main_title);
		tv_main_title.setText("登录");
		tv_back = ((TextView) findViewById(R.id.tv_back));
        tv_register = (TextView) findViewById(R.id.tv_register);
        tv_find_pwd = (TextView) findViewById(R.id.tv_find_pwd);
        btn_login = (Button) findViewById(R.id.btn_login);
        et_user_name = (EditText) findViewById(R.id.et_user_name);
        et_pwd = (EditText) findViewById(R.id.et_pwd);
        //返回按钮的点击事件
        tv_back.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				LoginActivity.this.finish();
			}
		});
        //立即注册控件的点击事件
        tv_register.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				Intent intent=new Intent(LoginActivity.this,RegisterActivity.class);
				startActivityForResult(intent, 1);
			}
		});
        //找回密码点击事件
        tv_find_pwd.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				//跳转到找回密码界面(此界面暂时未创建)
			}
		});
        //登录按钮点击事件
        btn_login.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				username=et_user_name.getText().toString().trim();
				pwd=et_pwd.getText().toString().trim();
				String md5Pwd=MD5Utils.MD5(pwd);
				spPwd=readPwd(username);
				if(TextUtils.isEmpty(username)){
                    Toast.makeText(LoginActivity.this, "请输入用户名", Toast.LENGTH_SHORT).show();
                    return;
                }else if (TextUtils.isEmpty(pwd)){
                    Toast.makeText(LoginActivity.this, "请输入密码", Toast.LENGTH_SHORT).show();
                    return;
                }else if(md5Pwd.equals(spPwd)){
                    Toast.makeText(LoginActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
                    //把登录状态和登录的用户名保存到SharedPreferences里面
                    saveLoginStatus(true,username);
                    //登录成功后通过Intent把登录成功的状态传递到MainActivity.java中
                    Intent data=new Intent();
                    data.putExtra("isLogin",true);
                    setResult(RESULT_OK,data);//setResult为OK,关闭当前页面
                    LoginActivity.this.finish();//在登录的时候,如果用户还没有注册则注册。注册成功后把注册成功后的用户名返回给前一个页面
                    startActivity(new Intent(LoginActivity.this, MainActivity.class));
                    return;
                }else if((!TextUtils.isEmpty(spPwd)&&!md5Pwd.equals(spPwd))){
                	Toast.makeText(LoginActivity.this, "用户名或密码错误", Toast.LENGTH_SHORT).show();
                    return;
                }else {
                	Toast.makeText(LoginActivity.this, "此用户不存在", Toast.LENGTH_SHORT).show();
				}
			}
		});
	}
	//从SharedPreferences中根据用户名读取密码
	private String readPwd(String username){
		SharedPreferences sp=getSharedPreferences("loginInfo", MODE_PRIVATE);
		return sp.getString(username,"");
	}
	
	//保存登录状态和登录用户名到SharedPrefarences中
	private void saveLoginStatus(boolean status,String username){
		//loginInfo表示文件名
		SharedPreferences sp=getSharedPreferences("loginInfo", MODE_PRIVATE);
		SharedPreferences.Editor editor=sp.edit();//获取编辑器
		editor.putBoolean("isLogin", status);
		editor.putString("loginUserName", username);//存入登录时的用户名
		editor.commit();//提交修改
	}
	@Override
	protected void onActivityResult(int requestCode,int resultCode,
			Intent data){
		super.onActivityResult(requestCode, resultCode, data);
		if(data!=null){
			//从注册界面传递过来的用户名
			String username=data.getStringExtra("username");
			if(!TextUtils.isEmpty(username)){
				et_user_name.setText(username);
				//设置光标的位置上
				et_user_name.setSelection(username.length());
			}
		}
	}
}

3.清单文件AndroidManifest.xml中注册

<activity android:name="china.ynyx.heyunhui.activity.LoginActivity"></activity>

4.完善功能

(1)欢迎界面SplashActivity.java

Intent intent=new Intent(SplashActivity.this,RegisterActivity.class);

改为:

Intent intent=new Intent(SplashActivity.this,LoginActivity.class);

实现欢迎界面3秒过后跳转到登录界面
(2)登录界面LoginActivity.java
基于eclipse的android项目实战—博学谷(三)登录界面
上图中添加如下代码:(已经有了就不要添加了)实现登录成功后跳转到主页面

startActivity(new Intent(LoginActivity.this, MainActivity.class));

参考资料:《android项目实战——博学谷》(黑马程序员著)