本项目是用eclipse软件编写,经过我的亲自实践,其真实有效,希望能给您有所帮助 项目版本:android5.1.1 AVD建议:android4.4.2及以上 |
个人资料界面主要用于显示用户信息,其中包含用户头像、用户名、昵称、性别和签名, 除了头像和用户名不可修改之外,其余信息均可修改
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>
博学谷用户具有用户名、昵称、性别等信息,为了便于后续对这些属性进行操作, 创建一个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;
}
在个人资料界面中,由于经常会对用户信息进行保存和更新,因此需要创建一个数据库来对用户信息进行操作,便于后续数据的显示和更新。
创建SQLiteHelper 类
选中china.ynyx.heyunhui包,在该包下创建一个china.ynyx.heyunhui.sqlite包。在.sqlite
包中创建一个Java类, 命名为SQLiteHelper
并继承SQLiteOpenHelper
类,同时重写onCreate()
方法,该类用于创建bxg.db
数据库。
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);
}
}
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});
}
}
个人资料界面主要用于展示用户的相关信息,当进入个人资料界面时,首先査询数据库中的用户信息,并将信息展示到界面上。
当点击“昵称”时跳转到昵称修改界面,当点击“性别”时弹出性别选择对话框,当点击“签名”时跳转到签名修改界面。
在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);
}
}
(1)修改“我”的界面代码
由于个人资料界面是通过“我”的界面跳转的,因此需要在“我的模块”中找到MylnfoView.java
文件中的initView()
方法,在注释“//已登录跳转到个人资料界面”
下方添加如下代码,并导入对应的包
Intent intent = new Intent(mContext,UserInfoActivity.class);
mContext.startActivity(intent);
(2)修改AndroidManifest.xml
清单文件
别忘了在AndroidManifest.xml
清单文件中注册:
<activity android:name="china.ynyx.heyunhui.activity.UserInfoActivity"></activity>
参考资料:《android项目实战——博学谷》(黑马程序员著)