基于eclipse的android项目实战—博学谷(九)个人资料界面

本项目是用eclipse软件编写,经过我的亲自实践,其真实有效,希望能给您有所帮助
项目版本:android5.1.1
AVD建议:android4.4.2及以上

文章目录

    • 效果图:
    • 1.创建个人资料界面布局文件`activity_user_info.xml`
    • 2.创建UserBean
    • 3.创建用户信息表
    • 4.DBUtils工具类
    • 5.个人资料界面逻辑代码
    • 6.功能完善

效果图:

个人资料界面主要用于显示用户信息,其中包含用户头像、用户名、昵称、性别和签名, 除了头像和用户名不可修改之外,其余信息均可修改

1.创建个人资料界面布局文件activity_user_info.xml

res/layout文件夹中新建activity_user_info.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:orientation="vertical" 
    android:background="@android:color/white">
    
    <include layout="@layout/main_title_bar"/>
    
    <RelativeLayout 
        android:id="@+id/rl_head"
        android:layout_width="match_parent"
        android:layout_height="70dp"
        android:layout_marginLeft="15dp"
        android:layout_marginRight="15dp">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:text="@string/head"
            android:textColor="#000000"
            android:textSize="20sp"/>
        <ImageView
            android:id="@+id/iv_head_icon"
            android:layout_width="60dp"
            android:layout_height="60dp"
        	android:contentDescription="@null"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:src="@drawable/default_icon"/>
    </RelativeLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#E4E4E4"/>
    <RelativeLayout
        android:id="@+id/rl_account"
        android:layout_width="match_parent"
        android:layout_height="70dp"
        android:layout_marginLeft="15dp"
        android:layout_marginRight="15dp">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:text="@string/user_name"
            android:textColor="#000000"
            android:textSize="20sp"/>
        <TextView
            android:id="@+id/tv_user_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_marginRight="5dp"
            android:textColor="#a3a3a3"
            android:textSize="18sp"/>
    </RelativeLayout>
    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#E4E4E4"/>
    <RelativeLayout
        android:id="@+id/rl_nickName"
        android:layout_width="match_parent"
        android:layout_height="70dp"
        android:layout_marginLeft="15dp"
        android:layout_marginRight="15dp">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:text="@string/nickName"
            android:textColor="#000000"
            android:textSize="20sp"/>
        <TextView
            android:id="@+id/tv_nickName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_marginRight="5dp"
            android:textColor="#a3a3a3"
            android:textSize="18sp"/>
    </RelativeLayout>
    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#E4E4E4"/>
    <RelativeLayout
        android:id="@+id/rl_sex"
        android:layout_width="match_parent"
        android:layout_height="70dp"
        android:layout_marginLeft="15dp"
        android:layout_marginRight="15dp">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:text="@string/sex"
            android:textColor="#000000"
            android:textSize="20sp"/>
        <TextView
            android:id="@+id/tv_sex"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_marginRight="5dp"
            android:textColor="#a3a3a3"
            android:textSize="18sp"/>
    </RelativeLayout>
    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#E4E4E4"/>
    <RelativeLayout
        android:id="@+id/rl_signature"
        android:layout_width="match_parent"
        android:layout_height="70dp"
        android:layout_marginLeft="15dp"
        android:layout_marginRight="15dp">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:text="@string/signature"
            android:textColor="#000000"
            android:textSize="20sp"/>
        <TextView
            android:id="@+id/tv_signature"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_marginRight="5dp"
            android:textColor="#a3a3a3"
            android:textSize="18sp"/>
    </RelativeLayout>
    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#E4E4E4"/>
</LinearLayout>

文本信息在values文件夹下的string.xml文件里面:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="head">头    像</string>
    <string name="user_name">用户名</string>
    <string name="nickName">昵    称</string>
    <string name="sex">性    别</string>
    <string name="signature">签     名</string>
</resources>

2.创建UserBean

博学谷用户具有用户名、昵称、性别等信息,为了便于后续对这些属性进行操作, 创建一个UserBean类来存放这些属性。

选中china.ynyx.heyunhui包,在该包下创建一个china.ynyx.heyunhui.bean包,在.bean包中创建一个Java类, 命名为UserBean

UserBean.java 具体代码:

package china.ynyx.heyunhui.bean;

public class UserBean {
	public  String userName;
    public  String nickName;
    public  String sex;
    public  String signature;
}

3.创建用户信息表

在个人资料界面中,由于经常会对用户信息进行保存和更新,因此需要创建一个数据库来对用户信息进行操作,便于后续数据的显示和更新。

创建SQLiteHelper 类
选中china.ynyx.heyunhui包,在该包下创建一个china.ynyx.heyunhui.sqlite包。在.sqlite包中创建一个Java类, 命名为SQLiteHelper并继承SQLiteOpenHelper类,同时重写onCreate()方法,该类用于创建bxg.db数据库。
基于eclipse的android项目实战—博学谷(九)个人资料界面_第1张图片
SQLiteHelper.java 具体代码:

package china.ynyx.heyunhui.sqlite;

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

public class SQLiteHelper extends SQLiteOpenHelper {

	private static final int DB_VERSION = 1;
    public static String DB_NAME = "bxg.db";
    public static final String U_USERINFO = "userinfo";// 个人资料
    public static final String U_VIDEO_PLAY_LIST = "videoplaylist";//视频播放列表
    public SQLiteHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }
    
	@Override
	public void onCreate(SQLiteDatabase db) {
		// TODO Auto-generated method stub
		/**
         * 创建个人信息表
         */
        db.execSQL("CREATE TABLE  IF NOT EXISTS " + U_USERINFO + "( "
                + "_id INTEGER PRIMARY KEY AUTOINCREMENT, "
                + "userName VARCHAR, "// 用户名
                + "nickName VARCHAR, "// 昵称
                + "sex VARCHAR, "// 性别
                + "signature VARCHAR"// 签名
                + ")");
        // 创建视频播放记录表
        db.execSQL("CREATE TABLE  IF NOT EXISTS " + U_VIDEO_PLAY_LIST + "( "
                + "_id INTEGER PRIMARY KEY AUTOINCREMENT, "
                +" userName VARCHAR,"//用户名
                + "chapterId INT, "//章节ID号
                + "videoId INT, "// 小节ID号
                + "videoPath VARCHAR, "// 视频地址
                + "title VARCHAR,"// 视频章节名称
                + "secondTitle VARCHAR"// 视频名称
                + ")");
	}

	/**
     * 当数据库版本号增加时才会调用此方法
     */
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO Auto-generated method stub
		db.execSQL("DROP TABLE IF EXISTS " + U_USERINFO);
        db.execSQL("DROP TABLE IF EXISTS " + U_VIDEO_PLAY_LIST);
        onCreate(db);
	}
}

4.DBUtils工具类

DBUtils工具类专门用于操作数据库。通过DBUtils类可以读取数据库中保存的用户信息, 将用户的个人信息保存到数据库中,以及对数据库中保存的用户信息进行修改。

china.ynyx.heyunhui.utils包中创建一个Java类,命名为DBUtils

package china.ynyx.heyunhui.utils;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import china.ynyx.heyunhui.bean.UserBean;
import china.ynyx.heyunhui.sqlite.SQLiteHelper;

public class DBUtils {

	private static DBUtils instance = null;
    private static SQLiteHelper helper;
    private static SQLiteDatabase db;
    public DBUtils(Context context) {
        helper = new SQLiteHelper(context);
        db = helper.getWritableDatabase();
    }
    public static DBUtils getInstance(Context context) {
        if (instance == null) {
            instance = new DBUtils(context);
        }
        return instance;
    }
    /**
     * 保存个人资料信息
     * 首先创建ContentValues对象, 通过ContentValues对象的cv.put()方法放入用户属性,最后调用insert()方法将用户属性保 存到数据库中。
     */
    public void saveUserInfo(UserBean bean) {
        ContentValues cv = new ContentValues();
        cv.put("userName", bean.userName);
        cv.put("nickName", bean.nickName);
        cv.put("sex", bean.sex);
        cv.put("signature", bean.signature);
        db.insert(SQLiteHelper.U_USERINFO, null, cv);
    }
    /**
     * 获取个人资料信息
     * 将査询到的个人信息存放到UserBean对象中。最后返回一个包含 个人资料信息的UserBean对象给方法调用者
     */
    public UserBean getUserInfo(String userName) {
    	//査询数据库的SQL语句
        String sql = "SELECT * FROM " + SQLiteHelper.U_USERINFO + " WHERE userName=?";
        Cursor cursor = db.rawQuery(sql, new String[]{userName});
        UserBean bean = null;
        while (cursor.moveToNext()) {
            bean = new UserBean();
            bean.userName=cursor.getString(cursor.getColumnIndex("userName"));
            bean.nickName=cursor.getString(cursor.getColumnIndex("nickName"));
            bean.sex=cursor.getString(cursor.getColumnIndex("sex"));
            bean.signature=cursor.getString(cursor
                    .getColumnIndex("signature"));
        }
        cursor.close();
        return bean;
    }
    /**
     * 修改个人资料
     * 通过调用ContentValues对象的update()方 法修改数据库中的个人资料。
     */
    public void updateUserInfo(String key, String value, String userName) {
        ContentValues cv = new ContentValues();
        cv.put(key, value);
        db.update(SQLiteHelper.U_USERINFO, cv, "userName=?",
                new String[]{userName});
    }
}

5.个人资料界面逻辑代码

个人资料界面主要用于展示用户的相关信息,当进入个人资料界面时,首先査询数据库中的用户信息,并将信息展示到界面上。
当点击“昵称”时跳转到昵称修改界面,当点击“性别”时弹出性别选择对话框,当点击“签名”时跳转到签名修改界面。

china.ynyx.heyunhui.activity包中创建一个Java类,命名为UserInfoActivity

package china.ynyx.heyunhui.activity;

import android.support.v7.app.AppCompatActivity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.pm.ActivityInfo;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import china.ynyx.heyunhui.R;
import china.ynyx.heyunhui.bean.UserBean;
import china.ynyx.heyunhui.utils.AnalysisUtils;
import china.ynyx.heyunhui.utils.DBUtils;

public class UserInfoActivity extends AppCompatActivity implements OnClickListener{
	
	private TextView tv_back;
    private TextView tv_main_title;
    private TextView tv_nickName, tv_signature, tv_user_name, tv_sex;
    private RelativeLayout rl_nickName, rl_sex, rl_signature,
            rl_title_bar;
    private String spUserName;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_user_info);
        //设置此界面为竖屏
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        //从SharedPreferences中获取登录时的用户名
        spUserName = AnalysisUtils.readLoginUserName(this);
        init();
        initData();
        setListener();
    }
    /**
     * 初始化控件
     */
    private void init() {
        tv_back = (TextView) findViewById(R.id.tv_back);
        tv_main_title = (TextView) findViewById(R.id.tv_main_title);
        tv_main_title.setText("个人资料");
        rl_title_bar = (RelativeLayout) findViewById(R.id.title_bar);
        rl_title_bar.setBackgroundColor(Color.parseColor("#30B4FF"));
        rl_nickName = (RelativeLayout) findViewById(R.id.rl_nickName);
        rl_sex = (RelativeLayout) findViewById(R.id.rl_sex);
        rl_signature = (RelativeLayout) findViewById(R.id.rl_signature);
        tv_nickName = (TextView) findViewById(R.id.tv_nickName);
        tv_user_name = (TextView) findViewById(R.id.tv_user_name);
        tv_sex = (TextView) findViewById(R.id.tv_sex);
        tv_signature = (TextView) findViewById(R.id.tv_signature);
    }
    /**
     * 获取数据
     */
    private void initData() {
        UserBean bean = null;
        bean = DBUtils.getInstance(this).getUserInfo(spUserName);
        // 首先判断一下数据库是否有数据
        if (bean == null) {
            bean = new UserBean();
            bean.userName=spUserName;
            bean.nickName="雨云耀辉";
            bean.sex="男";
            bean.signature="雨云耀辉";
            //保存用户信息到数据库
            DBUtils.getInstance(this).saveUserInfo(bean);
        }
        setValue(bean);
    }
    /**
     * 为界面控件设置值
     */
    private void setValue(UserBean bean) {
        tv_nickName.setText(bean.nickName);
        tv_user_name.setText(bean.userName);
        tv_sex.setText(bean.sex);
        tv_signature.setText(bean.signature);
    }
    /**
     * 设置控件的点击监听事件
     */
    private void setListener() {
        tv_back.setOnClickListener(this);
        rl_nickName.setOnClickListener(this);
        rl_sex.setOnClickListener(this);
        rl_signature.setOnClickListener(this);
    }
    /**
     * 控件的点击事件
     */
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.tv_back://返回键的点击事件
                this.finish();
                break;
            case R.id.rl_nickName://昵称的点击事件
                break;
            case R.id.rl_sex://性别的点击事件
                String sex = tv_sex.getText().toString();//获取性别控件上的数据
                sexDialog(sex);
                break;
            case R.id.rl_signature://签名的点击事件
                break;
            default:
                break;
        }
    }
    /**
     * 设置性别的弹出框
     */
    private void sexDialog(String sex){
        int sexFlag=0;
        if("男".equals(sex)){
            sexFlag=0;
        }else if("女".equals(sex)){
            sexFlag=1;
        }
        final String items[]={"男","女"};
        AlertDialog.Builder builder=new AlertDialog.Builder(this);  //先得到构造器
        builder.setTitle("性别"); //设置标题
        builder.setSingleChoiceItems(items,sexFlag,new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {//第二个参数是默认选中的哪个项
                dialog.dismiss();
                Toast.makeText(UserInfoActivity.this,items[which],Toast.LENGTH_SHORT).show();
                setSex(items[which]);
            }
        });
        builder.create().show();
    }
    /**
     * 更新界面上的性别数据
     */
    private void setSex(String sex){
        tv_sex.setText(sex);
        // 更新数据库中的性别字段
        DBUtils.getInstance(UserInfoActivity.this).updateUserInfo("sex",
                sex, spUserName);
    }
}

6.功能完善

(1)修改“我”的界面代码
由于个人资料界面是通过“我”的界面跳转的,因此需要在“我的模块”中找到MylnfoView.java文件中的initView()方法,在注释“//已登录跳转到个人资料界面” 下方添加如下代码,并导入对应的包

Intent intent = new Intent(mContext,UserInfoActivity.class);
mContext.startActivity(intent);

基于eclipse的android项目实战—博学谷(九)个人资料界面_第2张图片

(2)修改AndroidManifest.xml清单文件
别忘了在AndroidManifest.xml清单文件中注册:

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

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

你可能感兴趣的:(Android)