教育系统APP(五)

用一切抱怨的时间去努力
## 回顾上一期任务 ## 任务实施

修复fragment的小BUG
在未登录状态下,点击“点击登陆”,登陆完成后,应该显示“我”的界面,并且正常显示用户名。

在登陆状态下,点击“设置”->点击退出登录,应该继续显示“我”的界面,并且正常显示用户名。

修改密保设置页面
密保设置页面的按钮显示的是“验证”,这里应该是“设置”比较合理。
把按钮上的文字改成“设置”,要求修改密码界面按钮依然是“验证”。

优化找回密码
登陆界面的找回密码功能用的是初始化密码,要求改成设置新密码。
注意:显示设置新密码框时,按钮的文字也要变化哦!

教育系统APP(五)的发布

看看包
包的结构,图片的包就不看了,蓝色为修改,绿色为新添加

22

先解决上一次的问题

在未登录状态下,点击“点击登陆”,登陆完成后,应该显示“我”的界面,并且正常显示用户名。在登陆状态下,点击“设置”->点击退出登录,应该继续显示“我”的界面,并且正常显示用户名。解决这个问题,当我们登录后要保持刷新,以及fragment的刷新。

效果:

20

19

MainActivity.java

package cn.edu.gdmec.android.boxuegu.activity;

import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.KeyEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

import cn.edu.gdmec.android.boxuegu.R;
import cn.edu.gdmec.android.boxuegu.fragment.CourseFragment;
import cn.edu.gdmec.android.boxuegu.fragment.ExercisesFragment;
import cn.edu.gdmec.android.boxuegu.fragment.MyinfoFragment;
import cn.edu.gdmec.android.boxuegu.utils.AnalysisUtils;

/*任务在主界面的Hello World位置显示:用户名+“登录成功”*/
public class MainActivity extends FragmentActivity implements View.OnClickListener{
    private TextView tv_main_title;//标题
    private TextView tv_back;//返回按钮
    private RelativeLayout title_bar;
    private RelativeLayout main_body;
    private TextView bottom_bar_text_course;
    private ImageView bottom_bar_image_course;
    private RelativeLayout bottom_bar_course_btn;
    private TextView bottom_bar_text_exercises;
    private ImageView bottom_bar_image_exercises;
    private RelativeLayout bottom_bar_exercises_btn;
    private TextView bottom_bar_text_myinfo;
    private ImageView bottom_bar_image_myinfo;
    private RelativeLayout bottom_bar_myinfo_btn;
    private LinearLayout main_bottom_bar;
    protected long exitTime;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        setMain();
    }

    //给MainActivity加上退出清除登陆状态的方法。
    // 连续点击返回两次则退出,两次点击间隔超过2秒则提示再按一次退出。
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
            if ((System.currentTimeMillis() - exitTime) > 2000) {
                Toast.makeText(MainActivity.this, "再按一次退出博学谷", Toast.LENGTH_SHORT).show();
                exitTime = System.currentTimeMillis();
            } else {
                this.finish();
                if (AnalysisUtils.readLoginStatus(this)) {
                    AnalysisUtils.cleanLoginStatus(this);
                }
                System.exit(0);
            }
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

    private void setMain() {
        this.getSupportFragmentManager().beginTransaction().add(R.id.main_body,new MyinfoFragment()).commit();
        setSelectStatus(2);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (data!=null){
            boolean isLogin=data.getBooleanExtra("isLogin",false);
            if (isLogin){
                setSelectStatus(0);
            }
            else {
                setSelectStatus(2);
            }
        }
    }

    private void setSelectStatus(int index) {
        switch (index){
            case 0:
                bottom_bar_image_course.setImageResource(R.drawable.main_course_icon_selected);
                bottom_bar_text_course.setTextColor(Color.parseColor("#0097F7"));
                bottom_bar_text_exercises.setTextColor(Color.parseColor("#666666"));
                bottom_bar_text_myinfo.setTextColor(Color.parseColor("#666666"));
                bottom_bar_image_exercises.setImageResource(R.drawable.main_exercises_icon);
                bottom_bar_image_myinfo.setImageResource(R.drawable.main_my_icon);
                getSupportFragmentManager().beginTransaction().replace(R.id.main_body,new CourseFragment()).commit();
                tv_main_title.setText("博学谷课程");
                break;
            case 1:
                bottom_bar_image_exercises.setImageResource(R.drawable.main_exercises_icon_selected);
                bottom_bar_text_exercises.setTextColor(Color.parseColor("#0097F7"));
                bottom_bar_text_course.setTextColor(Color.parseColor("#666666"));
                bottom_bar_text_myinfo.setTextColor(Color.parseColor("#666666"));
                bottom_bar_image_course.setImageResource(R.drawable.main_course_icon);
                bottom_bar_image_myinfo.setImageResource(R.drawable.main_my_icon);
                getSupportFragmentManager().beginTransaction().replace(R.id.main_body,new ExercisesFragment()).commit();
                tv_main_title.setText("博学谷习题");
                break;
            case 2:
                bottom_bar_image_myinfo.setImageResource(R.drawable.main_my_icon_selected);
                bottom_bar_text_myinfo.setTextColor(Color.parseColor("#0097F7"));
                bottom_bar_text_course.setTextColor(Color.parseColor("#666666"));
                bottom_bar_text_exercises.setTextColor(Color.parseColor("#666666"));
                bottom_bar_image_exercises.setImageResource(R.drawable.main_exercises_icon);
                bottom_bar_image_course.setImageResource(R.drawable.main_course_icon);
                getSupportFragmentManager().beginTransaction().replace(R.id.main_body,new MyinfoFragment()).commit();
                tv_main_title.setText("博学谷");
                break;
        }
    }
    private void initView() {
        tv_main_title=findViewById(R.id.tv_main_title);
        title_bar=findViewById(R.id.title_bar);
        //底部导航栏
        main_body = findViewById(R.id.main_body);
        bottom_bar_text_course = findViewById(R.id.bottom_bar_text_course);
        bottom_bar_image_course = findViewById(R.id.bottom_bar_image_course);
        bottom_bar_course_btn = findViewById(R.id.bottom_bar_course_btn);
        bottom_bar_text_exercises = findViewById(R.id.bottom_bar_text_exercises);
        bottom_bar_image_exercises = findViewById(R.id.bottom_bar_image_exercises);
        bottom_bar_exercises_btn = findViewById(R.id.bottom_bar_exercises_btn);
        bottom_bar_text_myinfo = findViewById(R.id.bottom_bar_text_myinfo);
        bottom_bar_image_myinfo = findViewById(R.id.bottom_bar_image_myinfo);
        bottom_bar_myinfo_btn = findViewById(R.id.bottom_bar_myinfo_btn);
        main_bottom_bar = findViewById(R.id.main_bottom_bar);

        bottom_bar_course_btn.setOnClickListener(this);
        bottom_bar_exercises_btn.setOnClickListener(this);
        bottom_bar_myinfo_btn.setOnClickListener(this);

        tv_main_title.setText("博学谷课程");
        title_bar.setBackgroundColor(Color.parseColor("#30B4FF"));
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.bottom_bar_course_btn:
                //getSupportFragmentManager().beginTransaction().add(R.id.main_body,new CourseFragment()).commit();
                setSelectStatus(0);
                break;
            case R.id.bottom_bar_exercises_btn:
                //getSupportFragmentManager().beginTransaction().add(R.id.main_body,new ExercisesFragment()).commit();
                setSelectStatus(1);
                break;
            case R.id.bottom_bar_myinfo_btn:
                //getSupportFragmentManager().beginTransaction().add(R.id.main_body,new MyinfoFragment()).commit();
                setSelectStatus(2);
                break;
        }
    }
}

修改密保设置页面

密保设置页面的按钮显示的是“验证”,这里应该是“设置”比较合理。把按钮上的文字改成“设置”,要求修改密码界面按钮依然是“验证”,这个已经解决。

优化找回密码解决

找回密码功能用的是初始化密码,要求改成设置新密码。
注意:显示设置新密码框时,按钮的文字也要变化哦!

原来的效果:

21

更改后的效果:

17

这个是找回密码,那么就要在找回密码的布局进行添加。不过很高兴的是之前这个布局好像添加好了,不过要改一下个别几个。

activity_find_psw.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/login_bg"
    android:orientation="vertical">
    <!--找回密码需要设置标题栏-->
    <include layout="@layout/main_title_bar" />
    <TextView
        android:id="@+id/tv_user_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="35dp"
        android:layout_marginRight="35dp"
        android:layout_marginTop="35dp"
        android:text="您的用户名是?"
        android:textColor="@android:color/white"
        android:textSize="18sp"
        android:visibility="gone" />
    <EditText
        android:id="@+id/et_user_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="35dp"
        android:layout_marginRight="35dp"
        android:layout_marginTop="10dp"
        android:background="@drawable/find_psw_icon"
        android:hint="请输入您的用户名"
        android:inputType="text"
        android:paddingLeft="8dp"
        android:textColor="#000000"
        android:textColorHint="#A3A3A3"
        android:visibility="gone" />
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="35dp"
        android:layout_marginRight="35dp"
        android:layout_marginTop="15dp"
        android:text="您的姓名是?"
        android:textColor="@android:color/white"
        android:textSize="18sp"/>
    <EditText
        android:id="@+id/et_validate_name"
        android:layout_width="match_parent"
        android:layout_height="48dp"
        android:layout_marginLeft="35dp"
        android:layout_marginRight="35dp"
        android:layout_marginTop="10dp"
        android:background="@drawable/find_psw_icon"
        android:hint="请输入要验证的姓名"
        android:inputType="text"
        android:paddingLeft="8dp"
        android:textColor="#000000"
        android:textColorHint="#A3A3A3" />
    <TextView
        android:id="@+id/tv_reset_psw"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="35dp"
        android:layout_marginRight="35dp"
        android:layout_marginTop="15dp"
        android:text="输入您的新密码"
        android:textColor="@android:color/white"
        android:textSize="18sp"
        android:visibility="gone"/>
    <EditText
        android:id="@+id/et_reset_psw"
        android:layout_width="fill_parent"
        android:layout_height="48dp"
        android:layout_gravity="center_horizontal"
        android:layout_marginLeft="35dp"
        android:layout_marginRight="35dp"
        android:layout_marginTop="10dp"
        android:background="@drawable/login_psw_bg"
        android:drawableLeft="@drawable/psw_icon"
        android:drawablePadding="10dp"
        android:hint="请输入要设置的新密码"
        android:inputType="textPassword"
        android:paddingLeft="8dp"
        android:singleLine="true"
        android:textColor="#000000"
        android:textColorHint="#a3a3a3"
        android:textSize="18sp"
        android:visibility="gone"/>
    <Button
        android:id="@+id/btn_validate"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="35dp"
        android:layout_marginRight="35dp"
        android:layout_marginTop="15dp"
        android:background="@drawable/register_selector"
        android:text="验 证"
        android:textColor="@android:color/white"
        android:textSize="18sp" />
</LinearLayout>

接下来修改功能类:FindPswActivity.java
在打之前会发现有些是写过实例的,但是之前却没有显示出来,如果够细心的你,会发现。

package cn.edu.gdmec.android.boxuegu.activity;

import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

import cn.edu.gdmec.android.boxuegu.R;
import cn.edu.gdmec.android.boxuegu.utils.AnalysisUtils;
import cn.edu.gdmec.android.boxuegu.utils.MD5Utils;

public class FindPswActivity extends Activity implements View.OnClickListener {

    private TextView tv_back;
    private TextView tv_main_title;
    private RelativeLayout title_bar;
    private TextView tv_user_name;
    private EditText et_user_name;
    private EditText et_validate_name;
    private TextView tv_reset_psw;
    private TextView et_reset_psw;
    private Button btn_validate;
    private String from;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_find_psw);
        from=getIntent().getStringExtra("from");
        initView();
    }

    private void initView() {
        tv_back=findViewById(R.id.tv_back);
        tv_main_title=findViewById(R.id.tv_main_title);
        title_bar=findViewById(R.id.title_bar);
        tv_user_name=findViewById(R.id.tv_user_name);
        et_user_name=findViewById(R.id.et_user_name);
        et_validate_name=findViewById(R.id.et_validate_name);
        tv_reset_psw=findViewById(R.id.tv_reset_psw);
        et_reset_psw=findViewById(R.id.et_reset_psw);
        btn_validate=findViewById(R.id.btn_validate);
        if ("security".equals(from)){
            tv_main_title.setText("设置密保");
        }else{
            tv_main_title.setText("找回密码");
            tv_user_name.setVisibility(View.VISIBLE);
            et_user_name.setVisibility(View.VISIBLE);
        }
        tv_back.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FindPswActivity.this.finish();
            }
        });
        btn_validate.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn_validate:
                submit();
                break;
        }
    }
    private void submit() {
        // validate
        String validateName = et_validate_name.getText().toString().trim();
        if ("security".equals(from)) {  //设置密保
            if (TextUtils.isEmpty(validateName)) {
                Toast.makeText(this, "请输入要验证的姓名", Toast.LENGTH_SHORT).show();
                return;
            } else {
                Toast.makeText(this, "密保设置成功", Toast.LENGTH_SHORT).show();
                //保存到
                saveSecurity(validateName);
                FindPswActivity.this.finish();
                return;
            }
        }else {
            final String name=et_user_name.getText().toString().trim();
            String sp_security=readSecurity(name);
            if (TextUtils.isEmpty(name)){
                Toast.makeText(this,"请输入您的用户名",Toast.LENGTH_SHORT).show();
                return;
            }else if (!isExistUserName(name)){
                Toast.makeText(this,"您输入的用户名不存在",Toast.LENGTH_SHORT).show();
                return;
            }else if (TextUtils.isEmpty(validateName)){
                Toast.makeText(this,"请输入要验证的姓名",Toast.LENGTH_SHORT).show();
                return;
            }else if (!validateName.equals(sp_security)){
                Toast.makeText(this,"输入的密保不正确",Toast.LENGTH_SHORT).show();
                return;
            }else {
                /*tv_reset_psw.setVisibility(View.VISIBLE);
                tv_reset_psw.setText("初始密码:123456");
                savePsw(name);*/
                //输入密保正确,重新给用户设置一个密码
                tv_reset_psw.setVisibility(View.VISIBLE);
                et_reset_psw.setVisibility(View.VISIBLE);
                btn_validate.setText("设置");
                btn_validate.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        String resetPsw = et_reset_psw.getText().toString().trim();
                        //暂时仅验证不为空
                        if (!TextUtils.isEmpty(resetPsw)) {
                            savePsw(name, resetPsw);
                            FindPswActivity.this.finish();
                        } else {
                            Toast.makeText(FindPswActivity.this, "请输入要设置的新密码", Toast.LENGTH_SHORT).show();
                        }
                    }
                });
            }
        }
    }
    /**
     * 保存初始化密码
     **/
    private void savePsw(String name, String resetPsw){
        /*String md5Psw= MD5Utils.md5("123456");
        SharedPreferences sharedPreferences = getSharedPreferences("loginInfo",MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString(name,md5Psw);
        editor.commit();*/
        String md5Psw = MD5Utils.md5(resetPsw);
        SharedPreferences sp = getSharedPreferences("loginInfo", MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();
        editor.putString(name, md5Psw);
        editor.commit();
    }

    private boolean isExistUserName(String name){
        boolean hasUserName=false;
        SharedPreferences sharedPreferences=getSharedPreferences("loginInfo",MODE_PRIVATE);
        String spPsw=sharedPreferences.getString(name,"");
        if (!TextUtils.isEmpty(spPsw)){
            hasUserName=true;
        }
        return hasUserName;
    }
    /**
     * 读取密保
     **/
    private String readSecurity(String name){
        SharedPreferences sharedPreferences=getSharedPreferences("loginInfo",MODE_PRIVATE);
        String security=sharedPreferences.getString(name+"_security","");
        return security;
    }
    /**
     * 保存密保名字
     **/
    private void saveSecurity(String validateName) {
        SharedPreferences sharedPreferences=getSharedPreferences("loginInfo",MODE_PRIVATE);
        SharedPreferences.Editor editor=sharedPreferences.edit();
        editor.putString(AnalysisUtils.readLoginUserName(this)+"_security",validateName);
        editor.commit();
    }
}

搞定之前的项目了。最后看看此时包的结构,蓝色为修改,绿色为新添加

22

个人资料模块-新任务(这次的比较容易)

学习目标
项目实操
个人资料界面,布局,用户信息表
个人资料界面逻辑代码

个人资料修改,个人资料修改界面,个人资料修改界面逻辑代码

任务实施

个人资料加上QQ号属性

学习目标

掌握SQLite数据库的使用,能够实现使用数据库保存用户信息。
掌握个人资料界面的创建,并能实现个人资料的修改。

个人资料模块主要用于展示用户的基本信息,同时用户可以队个人资料中的昵称,性别和签名进行修改。
本章将针对个人资料模块进行详细讲解。

项目实操

个人资料界面
布局
创建一个新的布局文件,命名为activity_user_info。QQ号属性也写上去,进行显示,但是任务要求保存功能效果。

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:background="@android:color/white"
              android:orientation="vertical">
    <!--标题栏-->
    <include layout="@layout/main_title_bar" />
    <RelativeLayout
        android:id="@+id/rl_head"
        android:layout_width="fill_parent"
        android:layout_height="60dp"
        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="头  像"
            android:textColor="#000000"
            android:textSize="16sp" />
        <ImageView
            android:id="@+id/iv_head_icon"
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:src="@drawable/default_icon" />
    </RelativeLayout>
    <View
        android:layout_width="fill_parent"
        android:layout_height="1dp"
        android:background="#E4E4E4" />
    <RelativeLayout
        android:id="@+id/rl_account"
        android:layout_width="fill_parent"
        android:layout_height="60dp"
        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="用户名"
            android:textColor="#000000"
            android:textSize="16sp" />
        <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:text="用户名"
            android:textColor="#a3a3a3"
            android:textSize="14sp" />
    </RelativeLayout>
    <View
        android:layout_width="fill_parent"
        android:layout_height="1dp"
        android:background="#E4E4E4" />
    <RelativeLayout
        android:id="@+id/rl_nickName"
        android:layout_width="fill_parent"
        android:layout_height="60dp"
        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="昵  称"
            android:textColor="#000000"
            android:textSize="16sp" />
        <TextView
            android:id="@+id/tv_nick_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_marginRight="5dp"
            android:text="昵称"
            android:textColor="#a3a3a3"
            android:textSize="14sp" />
    </RelativeLayout>
    <View
        android:layout_width="fill_parent"
        android:layout_height="1dp"
        android:background="#E4E4E4" />
    <RelativeLayout
        android:id="@+id/rl_sex"
        android:layout_width="fill_parent"
        android:layout_height="60dp"
        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="性  别"
            android:textColor="#000000"
            android:textSize="16sp" />
        <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:singleLine="true"
            android:text="男"
            android:textColor="#a3a3a3"
            android:textSize="14sp" />
    </RelativeLayout>
    <View
        android:layout_width="fill_parent"
        android:layout_height="1dp"
        android:background="#E4E4E4" />
    <RelativeLayout
        android:id="@+id/rl_signature"
        android:layout_width="fill_parent"
        android:layout_height="60dp"
        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="签  名"
            android:textColor="#000000"
            android:textSize="16sp" />
        <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="14sp" />
        <!--android:text="你们好"-->
    </RelativeLayout>
    <View
        android:layout_width="fill_parent"
        android:layout_height="1dp"
        android:background="#E4E4E4" />
    <RelativeLayout
        android:id="@+id/rl_qq"
        android:layout_width="fill_parent"
        android:layout_height="60dp"
        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="Q Q"
            android:textColor="#000000"
            android:textSize="16sp" />
        <TextView
            android:id="@+id/tv_qq"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_marginRight="5dp"
            android:singleLine="true"
            android:text="未添加"
            android:textColor="#a3a3a3"
            android:textSize="14sp" />
    </RelativeLayout>
    <View
        android:layout_width="fill_parent"
        android:layout_height="1dp"
        android:background="#E4E4E4" />
</LinearLayout>

用户信息表

对于各个用户信息,我们需要用一个Bean类来存放这些属性。
新建一个包,命名为Bean。

在bean包下创建一个Java类,命名为UserBean。
写上需要用到的属性。

UserBean.java

package cn.edu.gdmec.android.boxuegu.bean;

public class UserBean {
    public String userName;//用户名
    public String nickName;//昵称
    public String sex;//性别
    public String signature;//签名
}

接下来是数据库类。
新建一个Sqlite包。在Sqlite包中建一个Java类,命名为SQLiteHelper。
SQLiteHelper.java

package cn.edu.gdmec.android.boxuegu.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_USER_INFO = "userInfo";

    public SQLiteHelper(Context context){
        super(context, DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        /**
         * 当这个SQLiteOpenHelper的子类类被实例化时会创建指定名的数据库,在onCreate中创建个人信息表
         * **/
        db.execSQL("CREATE TABLE IF NOT EXISTS " + U_USER_INFO + "( "
                + "_id  INTEGER PRIMARY KEY AUTOINCREMENT, "
                + "userName VARCHAR, "
                + "nickName VARCHAR, "
                + "sex VARCHAR, "
                + "signature VARCHAR "
                + ")");
    }

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

接下来创建一个数据库工具类,用于读取、保存、修改用户信息。
在utils包里建一个Java类,命名为DBUtils。

DBUtils.java

package cn.edu.gdmec.android.boxuegu.utils;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import cn.edu.gdmec.android.boxuegu.bean.UserBean;
import cn.edu.gdmec.android.boxuegu.sqlite.SQLiteHelper;

public class DBUtils {
    private static DBUtils instance = null;
    private static SQLiteHelper helper;
    private static SQLiteDatabase db;

    /**
     * 构造方法,只有当类被实例化时候调用
     * 实例化SQLiteHelper类,从中得到一个课读写的数据库
     **/
    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;
    }

    /**
     * 保存个人资料信息
     **/
    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);

        //Convenience method for inserting a row into the database.
        //注意,我们是从数据库使用插入方法,传入表名和数据集完成插入
        db.insert(SQLiteHelper.U_USER_INFO, null, cv);
    }

    /**
     * 获取个人资料信息
     **/
    public UserBean getUserInfo(String userName) {
        String sql = "SELECT * FROM " + SQLiteHelper.U_USER_INFO + " WHERE userName=?";
        //?和下面数组内元素会逐个替换,可以多条件查询=?and =?
        //You may include ?s in where clause in the query, which will be replaced by the values from selectionArgs.
        Cursor cursor = db.rawQuery(sql, new String[]{userName});
        UserBean bean = null;
        //Move the cursor to the next row.
        while (cursor.moveToNext()) {
            bean = new UserBean();
            //根据列索引获取对应的数值,因为这里查询结果只有一个,我们也不需要对模型UserBean进行修改,
            //直接将对应用户名的所有数据从表中动态赋值给bean
            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;
    }

    /**
     * 修改个人资料信息,这里的key指代表字段,value表示数值
     **/
    public void updateUserInfo(String key, String value, String userName) {
        ContentValues cv = new ContentValues();
        cv.put(key, value);
        //Convenience method for updating rows in the database.
        db.update(SQLiteHelper.U_USER_INFO, cv, "userName=?", new String[]
                {userName});
    }
}

个人资料界面逻辑代码

UserInfoActivity.java

package cn.edu.gdmec.android.boxuegu.activity;

import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.text.TextUtils;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

import cn.edu.gdmec.android.boxuegu.R;
import cn.edu.gdmec.android.boxuegu.bean.UserBean;
import cn.edu.gdmec.android.boxuegu.utils.AnalysisUtils;
import cn.edu.gdmec.android.boxuegu.utils.DBUtils;

public class UserInfoActivity extends Activity implements View.OnClickListener{
    //标题栏
    private RelativeLayout title_bar;
    private TextView tv_back;
    private TextView tv_main_title;
    //
    private RelativeLayout rl_head;
    private ImageView iv_head_icon;
    private RelativeLayout rl_account;//
    private TextView tv_user_name;
    private RelativeLayout rl_nickName;
    private TextView tv_nick_name;
    private RelativeLayout rl_sex;
    private TextView tv_sex;
    private RelativeLayout rl_signature;
    private TextView tv_signature;
    private RelativeLayout rl_qq;
    private TextView tv_qq;
    //
    private String spUserName;
    private String new_info;
    private static final int CHANGE_NICKNAME = 1;
    private static final int CHANGE_SIGNATURE = 2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_user_info);
        //设置此界面为竖屏
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        spUserName= AnalysisUtils.readLoginUserName(this);
        initView();
        initDate();
    }
    private void initDate() {
        UserBean bean = null;
        //实例化DBUtils,同时调用其方法获取个人信息资料
        bean = DBUtils.getInstance(this).getUserInfo(spUserName);
        //如果第一次进入,数据库没有保留用户信息
        if (bean == null) {
            bean = new UserBean();
            bean.userName = spUserName;
            bean.nickName = "问答精灵";
            bean.sex = "男";
            bean.signature = "这个人很懒,什么都没留下...";
            bean.qq= "未添加";
            //保存到数据库
            DBUtils.getInstance(this).saveUserInfo(bean);
        }
        setValue(bean);
    }
    private void initView() {
        //个人资料界面
        tv_back = findViewById(R.id.tv_back);
        tv_main_title = findViewById(R.id.tv_main_title);
        tv_main_title.setText("个人资料界面");
        title_bar = findViewById(R.id.title_bar);
        title_bar.setBackgroundColor(Color.parseColor("#30B4FF"));
        /**
         * rl_head iv_head_icon
         * rl_account tv_user_name
         * rl_nickName tv_nick_name
         * rl_sex tv_sex
         * rl_signature tv_signature
         * rl_qq tv_qq
         */
        rl_head=findViewById(R.id.rl_head);
        iv_head_icon=findViewById(R.id.iv_head_icon);
        rl_account=findViewById(R.id.rl_account);
        tv_user_name=findViewById(R.id.tv_user_name);
        rl_nickName=findViewById(R.id.rl_nickName);
        tv_nick_name=findViewById(R.id.tv_nick_name);
        rl_sex=findViewById(R.id.rl_sex);
        tv_sex=findViewById(R.id.tv_sex);
        rl_signature=findViewById(R.id.rl_signature);
        tv_signature=findViewById(R.id.tv_signature);
        rl_qq=findViewById(R.id.rl_qq);
        tv_qq=findViewById(R.id.tv_qq);
        //
        tv_back.setOnClickListener(this);
        rl_head.setOnClickListener(this);
        rl_account.setOnClickListener(this);
        rl_nickName.setOnClickListener(this);
        rl_sex.setOnClickListener(this);
        rl_signature.setOnClickListener(this);
        rl_qq.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.tv_back:
                this.finish();
                break;
            case R.id.rl_nickName:
                //昵称
                String name = tv_nick_name.getText().toString();
                Bundle bdName = new Bundle();
                bdName.putString("content", name);      //传递界面上的昵称数据
                bdName.putString("title", "昵称");
                bdName.putInt("flag", 1);
                //ActivityUserInfoActivity的Onclick()里昵称和签名响应加上跳转代码

                break;
            case R.id.rl_sex:
                String sex = tv_sex.getText().toString();
                sexDialog(sex);
                break;
            case R.id.rl_signature:
                //签名
                String signature = tv_signature.getText().toString();
                Bundle bdSignature = new Bundle();
                bdSignature.putString("content", signature); //传递界面上的签名数据
                bdSignature.putString("title", "签名");
                bdSignature.putInt("flag", 2);
                //ActivityUserInfoActivity的Onclick()里昵称和签名响应加上跳转代码

                break;
            default:
                break;
        }
    }

    /**
     * 为界面空间设置值
     **/
    private void setValue(UserBean bean) {
        tv_user_name.setText(bean.userName);
        tv_nick_name.setText(bean.nickName);
        tv_sex.setText(bean.sex);
        tv_signature.setText(bean.signature);
        tv_qq.setText(bean.qq);
    }
    /**
     * 设置性别弹出框
     **/
    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("性别");
        //sexFlag用来区分显示被选中项,如果sexFlag的值和在数组中的索引严格符合,下方which也可用sexFlag代替
        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(this).updateUserInfo("sex", sex, spUserName);
    }

    /**
     * 其实就是把需要传递的数值放置于bundle中,bundle作为附加到intent中
     * 获取回传数据是需要的跳转方法,第三个参数标示跳转是传递的数据
     **/
    public void enterActivityForResult(Class<?> to, int requestCode, Bundle b) {
        Intent i = new Intent(this, to);
        i.putExtras(b);
        startActivityForResult(i, requestCode);
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
            case CHANGE_NICKNAME:
                if (data != null) {
                    new_info = data.getStringExtra("nickName");
                    if (TextUtils.isEmpty(new_info)) {
                        return;
                    }
                    tv_nick_name.setText(new_info);
                    //更新数据库中昵称字段
                    DBUtils.getInstance(UserInfoActivity.this).updateUserInfo("nickName",
                            new_info, spUserName);
                }
                break;
            case CHANGE_SIGNATURE:
                if (data != null) {
                    new_info = data.getStringExtra("signature");
                    if (TextUtils.isEmpty(new_info)) {
                        return;
                    }
                    tv_signature.setText(new_info);
                    //更新数据库中签名字段
                    DBUtils.getInstance(UserInfoActivity.this).updateUserInfo("signature",
                            new_info, spUserName);
                }
                break;
        }
    }
}

MyinfoFragment.java中,找到跳转到个人资料界面的地方,添加跳转方法。

MyinfoFragment

@Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.ll_head:
                if (AnalysisUtils.readLoginStatus(getActivity())){
                    //跳转到个人资料界面
                    Intent intent=new Intent(getActivity(), UserInfoActivity.class);
                    getActivity().startActivity(intent);
                }else {
                    //跳转到登录界面
                    Intent intent = new Intent(getActivity(), LoginActivity.class);
                    getActivity().startActivityForResult(intent,1);
                }
                break;
            case R.id.rl_course_history:
                if (AnalysisUtils.readLoginStatus(getActivity())){
                    //跳转到播放记录页面
                }else {
                    Toast.makeText(getActivity(),"您未登录,请先登录",Toast.LENGTH_SHORT).show();
                }
                break;
            case R.id.rl_setting:
                if (AnalysisUtils.readLoginStatus(getActivity())){
                    //跳转到设置界面
                    Intent intent=new Intent(getActivity(), SettingActivity.class);
                    getActivity().startActivityForResult(intent,1);
                }else {
                    Toast.makeText(getActivity(),"您未登录,请先登录",Toast.LENGTH_SHORT).show();
                }
                break;
        }
    }

AndroidManifest.xml中声明Activity
AndroidManifest.xml

<activity android:name=".activity.UserInfoActivity"></activity>

个人资料修改

个人资料修改界面
修改界面需用到图片info_delete.png

新建布局文件,命名为activity_change_user_info
activity_change_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:background="#eeeeee"
    android:orientation="vertical">
    <include layout="@layout/main_title_bar" />
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:orientation="horizontal">
        <EditText
            android:id="@+id/et_content"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_gravity="center_horizontal"
            android:background="@android:color/white"
            android:gravity="center_vertical"
            android:singleLine="true"
            android:paddingLeft="10dp"
            android:textColor="#737373"
            android:textSize="14sp" />
        <ImageView
            android:id="@+id/iv_delete"
            android:layout_width="27dp"
            android:layout_height="27dp"
            android:layout_marginLeft="-40dp"
            android:src="@drawable/info_delete" />
    </LinearLayout>
</LinearLayout>

修改完信息后要保存,在标题栏加了个“保存”TextView。
到main_title_bar.xml中tv_main_title按钮的下方,加个“保存”。
main_title_bar.xml

<TextView
        android:id="@+id/tv_save"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_centerVertical="true"
        android:layout_marginRight="20dp"
        android:layout_marginTop="20dp"
        android:layout_alignParentRight="true"
        android:visibility="gone"
        android:text="保存"
        android:textColor="@android:color/white"
        android:textSize="16sp"/>

相信之前也写好了

<?xml version="1.0" encoding="utf-8"?>
<!--标题栏与返回键的创建,独立在main_title_bar.xml中-->
<!--标题栏设置高度为50dp,宽度为match_parent,设置背景颜色为通明为@android:color/transparent-->
<!--RelativeLayout为相对布局-->
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/title_bar"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:background="@android:color/transparent">
    <!--设置返回键TextView为高度50dp,宽度为50dp;id为android:id="@+id/tv_back"-->
    <!--layout_alignParentLeft为与父控件左对齐-->
    <!--layout_centerVertical为控件垂直居中-->
    <!--标题栏界面中的返回键在按下与弹起时,返回键会有明显的区别,这种效果通过背景选择器进行实现-->
    <TextView
        android:id="@+id/tv_back"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:background="@drawable/go_back_selector"/>
    <!--设置id为android:id="@+id/tv_main_title-->
    <!--该TextView为显示文本-->
    <!--layout_centerInparent为居中显示-->
    <TextView
        android:id="@+id/tv_main_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@android:color/white"
        android:textSize="20sp"
        android:layout_centerInParent="true"/>
    <!--到main_title_bar.xml中tv_main_title按钮的下方,加个“保存”-->
    <TextView
        android:id="@+id/tv_save"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_centerVertical="true"
        android:layout_marginRight="20dp"
        android:layout_marginTop="20dp"
        android:layout_alignParentRight="true"
        android:visibility="gone"
        android:text="保存"
        android:textColor="@android:color/white"
        android:textSize="16sp"/>
</RelativeLayout>

个人资料修改界面逻辑代码

生成ChangeUserInfoActivity,生成控件实例化代码。

资料修改界面的完整代码:
ChangeUserInfoActivity.java

package cn.edu.gdmec.android.boxuegu.activity;

import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.Editable;
import android.text.Selection;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

import cn.edu.gdmec.android.boxuegu.R;

public class ChangeUserInfoActivity extends AppCompatActivity implements View.OnClickListener{
    //标题栏
    private TextView tv_back;
    private TextView tv_main_title;
    private TextView tv_save;
    private RelativeLayout rl_title_bar;
    //
    private EditText et_content;
    private ImageView iv_delete;
    private String title, content;
    private int flag;  //flag为1时表示修改昵称,为2时表示修改签名
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_change_user_info);
        //设置此界面为竖屏
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        initView();
    }
    private void initView() {
        tv_back = (TextView) findViewById(R.id.tv_back);
        tv_main_title = (TextView) findViewById(R.id.tv_main_title);
        tv_save = (TextView) findViewById(R.id.tv_save);
        rl_title_bar = (RelativeLayout) findViewById(R.id.title_bar);
        et_content = (EditText) findViewById(R.id.et_content);
        iv_delete = (ImageView) findViewById(R.id.iv_delete);
        //从个人资料界面传递过来的标题和内容
        title = getIntent().getStringExtra("title");
        content = getIntent().getStringExtra("content");
        flag = getIntent().getIntExtra("flag", 0);
        tv_main_title.setText(title);
        tv_save.setVisibility(View.VISIBLE);
        rl_title_bar.setBackgroundColor(Color.parseColor("#30B4FF"));

        tv_back.setOnClickListener(this);
        iv_delete.setOnClickListener(this);
        tv_save.setOnClickListener(this);

        if (!TextUtils.isEmpty(content)){
            et_content.setText(content);
            et_content.setSelection(content.length());
        }
        contentListener();
    }

    /**
     * 监听个人资料修改界面输入的文字
     **/
    private void contentListener() {
        et_content.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                Editable editable = et_content.getText();
                int len = editable.length();//输入文本的长度
                if (len >= 0) {
                    iv_delete.setVisibility(View.VISIBLE);
                } else {
                    iv_delete.setVisibility(View.GONE);
                }
                switch (flag) {
                    case 1://昵称,最多8个文字,超过则截取多余文字
                        if (len > 8) {
                            int selEndIndex = Selection.getSelectionEnd(editable);
                            String str = editable.toString();
                            //截取新字符串
                            String newStr = str.substring(0, 8);
                            et_content.setText(newStr);
                            editable = et_content.getText();
                            //新字符串长度
                            int newLen = editable.length();
                            //旧光标位置超过新字符串长度
                            if (selEndIndex > newLen) {
                                selEndIndex = editable.length();
                            }
                            //设置新光标所在位置
                            Selection.setSelection(editable, selEndIndex);
                        }
                        break;
                    case 2: //签名,做多16,
                        if (len > 16) {
                            int selEndIndex = Selection.getSelectionEnd(editable);
                            String str = editable.toString();
                            String newStr = str.substring(0, 16);
                            et_content.setText(newStr);
                            editable = et_content.getText();
                            int newLen = editable.length();
                            if (selEndIndex > newLen) {
                                selEndIndex = editable.length();
                            }
                            Selection.setSelection(editable, selEndIndex);
                        }
                        break;
                    default:
                        break;
                }
            }

            @Override
            public void afterTextChanged(Editable editable) {

            }
        });
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.tv_back:
                finish();
                break;
            case R.id.iv_delete:
                et_content.setText("");
                break;
            case R.id.tv_save:
                Intent data = new Intent();
                String etContent = et_content.getText().toString().trim();
                switch (flag) {
                    case 1:
                        if (!TextUtils.isEmpty(etContent)) {
                            data.putExtra("nickName", etContent);
                            setResult(RESULT_OK, data);
                            Toast.makeText(this, "保存成功", Toast.LENGTH_SHORT).show();
                            ChangeUserInfoActivity.this.finish();
                        } else {
                            Toast.makeText(this, "昵称不能为空", Toast.LENGTH_SHORT).show();
                        }
                        break;
                    case 2:
                        if (!TextUtils.isEmpty(etContent)) {
                            data.putExtra("signature", etContent);
                            setResult(RESULT_OK, data);
                            Toast.makeText(this, "保存成功", Toast.LENGTH_SHORT).show();
                            ChangeUserInfoActivity.this.finish();
                        } else {
                            Toast.makeText(this, "签名不能为空", Toast.LENGTH_SHORT).show();
                        }
                        break;
                }
        }
    }
}

UserInfoActivity的Onclick()里昵称和签名响应加上跳转代码

@Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.tv_back:
                this.finish();
                break;
            case R.id.rl_nickName:
                //昵称
                String name = tv_nick_name.getText().toString();
                Bundle bdName = new Bundle();
                bdName.putString("content", name);      //传递界面上的昵称数据
                bdName.putString("title", "昵称");
                bdName.putInt("flag", 1);
                //ActivityUserInfoActivity的Onclick()里昵称和签名响应加上跳转代码
                enterActivityForResult(ChangeUserInfoActivity.class, CHANGE_NICKNAME, bdName);//跳转到修改界面
                break;
            case R.id.rl_sex:
                String sex = tv_sex.getText().toString();
                sexDialog(sex);
                break;
            case R.id.rl_signature:
                //签名
                String signature = tv_signature.getText().toString();
                Bundle bdSignature = new Bundle();
                bdSignature.putString("content", signature); //传递界面上的签名数据
                bdSignature.putString("title", "签名");
                bdSignature.putInt("flag", 2);
                //ActivityUserInfoActivity的Onclick()里昵称和签名响应加上跳转代码
                enterActivityForResult(ChangeUserInfoActivity.class, CHANGE_SIGNATURE, bdSignature);
                break;
            default:
                break;
        }
    }

再到AndroidManifest.xml中声明activity

<activity android:name=".activity.ChangeUserInfoActivity"></activity>

这次的包结构

23

24

任务实施

个人资料加上QQ号属性
在个人资料下添加一个“QQ号”属性,初始状态文字显示“未添加”,点击进入修改页面,输入框的键盘类型只能为数字。
(提示:editText.setInputType(InputType.TYPE_CLASS_NUMBER) )
输入框最多只能输入12位数字,点击保存后个人资料界面能正常显示保存后的结果。

总结

这是走好Android的五步!


文章作者: Jeskson
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Jeskson !
评论
 上一篇
教育系统APP(六) 教育系统APP(六)
用一切抱怨的时间去努力 ## 回顾上一期任务 任务实施个人资料加上QQ号属性在个人资料下添加一个“QQ号”属性,初始状态文字显示“未添加”,点击进入修改页面,输入框的键盘类型只能为数字。(提示:editText.setInputType
2018-04-26
下一篇 
教育系统APP(四) 教育系统APP(四)
“我”的模块掌握修改密码功能的开发,实现用户密码的修改掌握设置密保功能的开发,并且通过密保可以找回用户密码 挑战任务初次打开页面都是Fragment_1,请修改相关代码,让初始打开的页面为Fragment_3,别忘了底部导航栏也要变颜色哦
2018-04-24
  目录