diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 41afc96..50a5060 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -11,6 +11,12 @@
android:supportsRtl="true"
android:theme="@style/Theme.AppCompat.NoActionBar"
tools:targetApi="31">
+
+
diff --git a/app/src/main/java/com/youxuegu/MainActivity.java b/app/src/main/java/com/youxuegu/MainActivity.java
index a104db7..20d8c85 100644
--- a/app/src/main/java/com/youxuegu/MainActivity.java
+++ b/app/src/main/java/com/youxuegu/MainActivity.java
@@ -3,21 +3,250 @@ package com.youxuegu;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
+import android.graphics.Color;
import android.os.Bundle;
+import android.view.KeyEvent;
+import android.view.View;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+import android.widget.Toast;
import com.youxuegu.activity.LoginActivity;
import com.youxuegu.activity.RegisterActivity;
+import com.youxuegu.utils.UtilsHelper;
+import com.youxuegu.view.MyInfoView;
/**
* @author YoVinchen
*/
-public class MainActivity extends AppCompatActivity {
+public class MainActivity extends AppCompatActivity implements View.OnClickListener {
+ private FrameLayout mBodyLayout; //中间内容栏
+ public LinearLayout mBottomLayout; //底部按钮栏
+ private View mCourseBtn, mExercisesBtn, mMyInfoBtn;
+ private TextView tv_course, tv_exercises, tv_myInfo;
+ private ImageView iv_course, iv_exercises, iv_myInfo;
+ private TextView tv_back, tv_main_title;
+ private RelativeLayout rl_title_bar;
+
+ private MyInfoView mMyInfoView;
+// private ExercisesView mExercisesView;
+// private CourseView mCourseView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
- Intent intent = new Intent(MainActivity.this, LoginActivity.class);
- startActivity(intent);
+ init();
+ setListener();
+ selectDisplayView(0);
+ }
+
+ /**
+ * 获取界面上的控件
+ */
+ private void init() {
+ tv_back = findViewById(R.id.tv_back);
+ tv_main_title = findViewById(R.id.tv_main_title);
+ tv_main_title.setText("优学谷课程");
+ rl_title_bar = findViewById(R.id.title_bar);
+ rl_title_bar.setBackgroundColor(Color.parseColor("#30B4FF"));
+ tv_back.setVisibility(View.GONE);
+ mBodyLayout = findViewById(R.id.main_body);
+ mBottomLayout = findViewById(R.id.main_bottom_bar);
+ mCourseBtn = findViewById(R.id.bottom_bar_course_btn);
+ mExercisesBtn = findViewById(R.id.bottom_bar_exercises_btn);
+ mMyInfoBtn = findViewById(R.id.bottom_bar_myinfo_btn);
+ tv_course = findViewById(R.id.bottom_bar_text_course);
+ tv_exercises = findViewById(R.id.bottom_bar_text_exercises);
+ tv_myInfo = findViewById(R.id.bottom_bar_text_myinfo);
+ iv_course = findViewById(R.id.bottom_bar_image_course);
+ iv_exercises = findViewById(R.id.bottom_bar_image_exercises);
+ iv_myInfo = findViewById(R.id.bottom_bar_image_myinfo);
+ }
+
+
+ /**
+ * 设置底部按钮未被选中时的状态
+ */
+ private void setNotSelectedStatus() {
+ tv_course.setTextColor(Color.parseColor("#666666"));
+ tv_exercises.setTextColor(Color.parseColor("#666666"));
+ tv_myInfo.setTextColor(Color.parseColor("#666666"));
+ iv_course.setImageResource(R.drawable.main_course_icon);
+ iv_exercises.setImageResource(R.drawable.main_exercises_icon);
+ iv_myInfo.setImageResource(R.drawable.main_my_icon);
+ for (int i = 0; i < mBottomLayout.getChildCount(); i++) {
+ mBottomLayout.getChildAt(i).setSelected(false);
+ }
+ }
+
+ /**
+ * 设置底部按钮被选中时的状态
+ */
+ private void setSelectedStatus(int index) {
+ switch (index) {
+ case 0:
+ mCourseBtn.setSelected(true);
+ iv_course.setImageResource(R.drawable.main_course_icon_selected);
+ tv_course.setTextColor(Color.parseColor("#0097F7"));
+ rl_title_bar.setVisibility(View.VISIBLE);
+ tv_main_title.setText("优学谷课程");
+ break;
+ case 1:
+ mExercisesBtn.setSelected(true);
+ iv_exercises.setImageResource(R.drawable.main_exercises_icon_selected);
+ tv_exercises.setTextColor(Color.parseColor("#0097F7"));
+ rl_title_bar.setVisibility(View.VISIBLE);
+ tv_main_title.setText("优学谷习题");
+ break;
+ case 2:
+ mMyInfoBtn.setSelected(true);
+ iv_myInfo.setImageResource(R.drawable.main_my_icon_selected);
+ tv_myInfo.setTextColor(Color.parseColor("#0097F7"));
+ rl_title_bar.setVisibility(View.GONE);
+ break;
+ }
+ }
+
+
+ /**
+ * 隐藏底部导航栏界面的中间部分视图
+ */
+ private void hideAllView() {
+ for (int i = 0; i < mBodyLayout.getChildCount(); i++) {
+ mBodyLayout.getChildAt(i).setVisibility(View.GONE);
+ }
+ }
+
+ /**
+ * 创建视图
+ */
+ private void createView(int viewIndex) {
+ switch (viewIndex) {
+ case 0:
+ //课程界面
+// if (mCourseView == null) {
+// mCourseView = new CourseView(this);
+// mBodyLayout.addView(mCourseView.getView());
+// } else {
+// mCourseView.getView();
+// }
+// mCourseView.showView();
+ break;
+ case 1:
+ //习题界面
+// if (mExercisesView == null) {
+// mExercisesView = new ExercisesView(this); //实例化ExercisesView类
+// mBodyLayout.addView(mExercisesView.getView()); //将习题界面添加到底部导航栏的布局中
+// } else {
+// mExercisesView.getView(); //获取习题界面
+// }
+// mExercisesView.showView(); //显示习题界面
+ break;
+ case 2:
+ //"我"的界面
+ if (mMyInfoView == null) {
+ mMyInfoView = new MyInfoView(this);
+ //加载“我”的界面
+ mBodyLayout.addView(mMyInfoView.getView());
+ } else {
+ //获取“我”的界面
+ mMyInfoView.getView();
+ }
+ //显示“我”的界面
+ mMyInfoView.showView();
+ break;
+ }
+ }
+
+ /**
+ * 设置底部按钮被选中时对应的界面中间部分视图
+ */
+ private void selectDisplayView(int index) {
+ //隐藏所有视图
+ hideAllView();
+ //创建被选中按钮对应的视图
+ createView(index);
+ //设置被选中按钮的选中状态
+ setSelectedStatus(index);
+ }
+
+ /**
+ * 设置底部3个按钮的点击事件的监听器
+ */
+ private void setListener() {
+ for (int i = 0; i < mBottomLayout.getChildCount(); i++) {
+ mBottomLayout.getChildAt(i).setOnClickListener(this);
+ }
+ }
+
+ @Override
+ public void onClick(View v) {
+ switch (v.getId()) {
+ //"课程"按钮的点击事件
+ case R.id.bottom_bar_course_btn:
+ setNotSelectedStatus();
+ selectDisplayView(0);
+ break;
+ //"习题"按钮的点击事件
+ case R.id.bottom_bar_exercises_btn:
+ setNotSelectedStatus();
+ selectDisplayView(1);
+ break;
+ //"我"的按钮的点击事件
+ case R.id.bottom_bar_myinfo_btn:
+ setNotSelectedStatus();
+ selectDisplayView(2);
+ break;
+ default:
+ break;
+ }
+ }
+
+
+ /**
+ * 记录第一次点击时的时间
+ */
+ protected long exitTime;
+
+ @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 {
+ MainActivity.this.finish();
+ if (UtilsHelper.readLoginStatus(MainActivity.this)) {
+ //清除登录状态与用户名
+ UtilsHelper.clearLoginStatus(MainActivity.this);
+ }
+ System.exit(0);
+ }
+ return true;
+ }
+ return super.onKeyDown(keyCode, event);
+ }
+
+ @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) {
+ setNotSelectedStatus();
+ selectDisplayView(0);
+ }
+ if (mMyInfoView != null) {
+ //登录成功或退出登录时根据isLogin的值设置"我"的界面
+ mMyInfoView.setLoginParams(isLogin);
+ }
+ }
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/youxuegu/activity/ModifyPswActivity.java b/app/src/main/java/com/youxuegu/activity/ModifyPswActivity.java
new file mode 100644
index 0000000..be7160f
--- /dev/null
+++ b/app/src/main/java/com/youxuegu/activity/ModifyPswActivity.java
@@ -0,0 +1,96 @@
+package com.youxuegu.activity;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+import android.content.Intent;
+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 com.youxuegu.R;
+import com.youxuegu.utils.MD5Utils;
+import com.youxuegu.utils.UtilsHelper;
+
+public class ModifyPswActivity extends AppCompatActivity implements View.OnClickListener {
+ private TextView tv_main_title;
+ private TextView tv_back;
+ private EditText et_original_psw, et_new_psw, et_new_psw_again;
+ private Button btn_save;
+ private String originalPsw, newPsw, newPswAgain;
+ private String spOriginalPsw, userName;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_modify_psw);
+ init();
+ userName = UtilsHelper.readLoginUserName(this);
+ spOriginalPsw = UtilsHelper.readPsw(this, userName);
+ }
+
+ private void init() {
+ tv_main_title = findViewById(R.id.tv_main_title);
+ tv_main_title.setText("修改密码");
+ tv_back = findViewById(R.id.tv_back);
+ et_original_psw = findViewById(R.id.et_original_psw);
+ et_new_psw = findViewById(R.id.et_new_psw);
+ et_new_psw_again = findViewById(R.id.et_new_psw_again);
+ btn_save = findViewById(R.id.btn_save);
+ tv_back.setOnClickListener(this);
+ btn_save.setOnClickListener(this);
+ }
+
+ @Override
+ public void onClick(View view) {
+ switch (view.getId()) {
+ case R.id.tv_back:
+ ModifyPswActivity.this.finish();
+ break;
+ case R.id.btn_save:
+ getEditString();
+ if (TextUtils.isEmpty(originalPsw)) {
+ Toast.makeText(ModifyPswActivity.this, "请输入原始密码", Toast.LENGTH_SHORT).show();
+ return;
+ } else if (!MD5Utils.md5(originalPsw).equals(spOriginalPsw)) {
+ Toast.makeText(ModifyPswActivity.this, "输入的密码与原始密码不相同", Toast.LENGTH_SHORT).show();
+ return;
+ } else if (MD5Utils.md5(newPsw).equals(spOriginalPsw)) {
+ Toast.makeText(ModifyPswActivity.this, "输入的新密码与原始密码不能相同", Toast.LENGTH_SHORT).show();
+ return;
+ } else if (TextUtils.isEmpty(newPsw)) {
+ Toast.makeText(ModifyPswActivity.this, "请输入新密码", Toast.LENGTH_SHORT).show();
+ return;
+ } else if (TextUtils.isEmpty(newPswAgain)) {
+ Toast.makeText(ModifyPswActivity.this, "请再次输入新密码", Toast.LENGTH_SHORT).show();
+ return;
+ } else if (!newPsw.equals(newPswAgain)) {
+ Toast.makeText(ModifyPswActivity.this, "两次输入的新密码不一致", Toast.LENGTH_SHORT).show();
+ return;
+ } else {
+ Toast.makeText(ModifyPswActivity.this, "新密码设置成功", Toast.LENGTH_SHORT).show();
+ //保存新密码到SharedPreferences文件中
+ UtilsHelper.saveUserInfo(ModifyPswActivity.this, userName, newPsw);
+ Intent intent = new Intent(ModifyPswActivity.this, LoginActivity.class);
+ startActivity(intent);
+ //关闭设置界面
+ SettingActivity.instance.finish();
+ //关闭修改密码界面
+ ModifyPswActivity.this.finish();
+ }
+ break;
+ }
+ }
+
+ /**
+ * 获取界面输入框控件上的字符串
+ */
+ private void getEditString() {
+ originalPsw = et_original_psw.getText().toString().trim();
+ newPsw = et_new_psw.getText().toString().trim();
+ newPswAgain = et_new_psw_again.getText().toString().trim();
+ }
+}
diff --git a/app/src/main/java/com/youxuegu/activity/SettingActivity.java b/app/src/main/java/com/youxuegu/activity/SettingActivity.java
new file mode 100644
index 0000000..4a75858
--- /dev/null
+++ b/app/src/main/java/com/youxuegu/activity/SettingActivity.java
@@ -0,0 +1,75 @@
+package com.youxuegu.activity;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+import android.content.Intent;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.youxuegu.R;
+import com.youxuegu.utils.UtilsHelper;
+
+public class SettingActivity extends AppCompatActivity implements View.OnClickListener {
+ private TextView tv_main_title;
+ private TextView tv_back;
+ private RelativeLayout rl_title_bar;
+ private RelativeLayout rl_modify_psw, rl_security_setting, rl_exit_login;
+ public static SettingActivity instance = null;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_setting);
+ instance = this;
+ init();
+ }
+
+ private void init() {
+ tv_main_title = findViewById(R.id.tv_main_title);
+ tv_main_title.setText("设置");
+ tv_back = findViewById(R.id.tv_back);
+ rl_title_bar = findViewById(R.id.title_bar);
+ rl_title_bar.setBackgroundColor(Color.parseColor("#30B4FF"));
+ rl_modify_psw = findViewById(R.id.rl_modify_psw);
+ rl_security_setting = findViewById(R.id.rl_security_setting);
+ rl_exit_login = findViewById(R.id.rl_exit_login);
+ tv_back.setOnClickListener(this);
+ rl_modify_psw.setOnClickListener(this);
+ rl_security_setting.setOnClickListener(this);
+ rl_exit_login.setOnClickListener(this);
+ }
+
+ @Override
+ public void onClick(View view) {
+ switch (view.getId()) {
+ case R.id.tv_back:
+ this.finish();
+ break;
+ case R.id.rl_modify_psw:
+ //跳转到修改密码界面
+ Intent intent = new Intent(SettingActivity.this, ModifyPswActivity.class);
+ startActivity(intent);
+ break;
+ case R.id.rl_security_setting:
+ //跳转到设置密保界面
+// Intent securityIntent = new Intent(SettingActivity.this, FindPswActivity.class);
+// securityIntent.putExtra("from", "security");
+// startActivity(securityIntent);
+ break;
+ case R.id.rl_exit_login:
+ Toast.makeText(SettingActivity.this, "退出登录成功", Toast.LENGTH_SHORT).show();
+ //清除登录状态和登录时的用户名
+ UtilsHelper.clearLoginStatus(SettingActivity.this);
+ Intent data = new Intent();
+ data.putExtra("isLogin", false);
+ setResult(RESULT_OK, data);
+ SettingActivity.this.finish();
+ break;
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/youxuegu/utils/UtilsHelper.java b/app/src/main/java/com/youxuegu/utils/UtilsHelper.java
index b19140f..d6fa5a4 100644
--- a/app/src/main/java/com/youxuegu/utils/UtilsHelper.java
+++ b/app/src/main/java/com/youxuegu/utils/UtilsHelper.java
@@ -59,4 +59,28 @@ public class UtilsHelper {
//提交修改
editor.commit();
}
+
+ public static boolean readLoginStatus(Context context) {
+ SharedPreferences sp = context.getSharedPreferences("loginInfo", Context.MODE_PRIVATE);
+ boolean isLogin = sp.getBoolean("isLogin", false);
+ return isLogin;
+ }
+
+ public static void clearLoginStatus(Context context) {
+ SharedPreferences sp = context.getSharedPreferences("loginInfo", Context.MODE_PRIVATE);
+ //获取编辑器
+ SharedPreferences.Editor editor = sp.edit();
+ //清除登录状态
+ editor.putBoolean("isLogin", false);
+ //清除登录时的用户名
+ editor.putString("loginUserName", "");
+ //提交修改
+ editor.commit();
+ }
+ public static String readLoginUserName(Context context) {
+ SharedPreferences sp = context.getSharedPreferences("loginInfo", Context.MODE_PRIVATE);
+ //获取登录时用户名
+ String userName = sp.getString("loginUserName", "");
+ return userName;
+ }
}
diff --git a/app/src/main/java/com/youxuegu/view/MyInfoView.java b/app/src/main/java/com/youxuegu/view/MyInfoView.java
new file mode 100644
index 0000000..25d0c4f
--- /dev/null
+++ b/app/src/main/java/com/youxuegu/view/MyInfoView.java
@@ -0,0 +1,118 @@
+package com.youxuegu.view;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.view.LayoutInflater;
+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 com.youxuegu.R;
+import com.youxuegu.activity.LoginActivity;
+import com.youxuegu.activity.SettingActivity;
+import com.youxuegu.utils.UtilsHelper;
+
+/**
+ * @author YoVinchen
+ */
+public class MyInfoView implements View.OnClickListener {
+ public ImageView iv_head_icon;
+ private LinearLayout ll_head;
+ private RelativeLayout rl_course_history, rl_setting;
+ private TextView tv_user_name;
+ private Activity mContext;
+ private LayoutInflater mInflater;
+ private View mCurrentView;
+ //记录登录状态
+ private boolean isLogin = false;
+
+ public MyInfoView(Activity context) {
+ mContext = context;
+ mInflater = LayoutInflater.from(mContext);
+ }
+
+ private void initView() {
+ mCurrentView = mInflater.inflate(R.layout.main_view_myinfo, null);
+ ll_head = mCurrentView.findViewById(R.id.ll_head);
+ iv_head_icon = mCurrentView.findViewById(R.id.iv_head_icon);
+ rl_course_history = mCurrentView.findViewById(R.id.rl_course_history);
+ rl_setting = mCurrentView.findViewById(R.id.rl_setting);
+ tv_user_name = mCurrentView.findViewById(R.id.tv_user_name);
+ mCurrentView.setVisibility(View.VISIBLE);
+ //设置登录时界面控件的显示信息
+ setLoginParams(isLogin);
+ ll_head.setOnClickListener(this);
+ rl_course_history.setOnClickListener(this);
+ rl_setting.setOnClickListener(this);
+ }
+
+ @Override
+ public void onClick(View view) {
+ switch (view.getId()) {
+ case R.id.ll_head:
+ if (UtilsHelper.readLoginStatus(mContext)) {
+ //跳转到个人资料界面
+// Intent intent = new Intent(mContext, UserInfoActivity.class);
+// mContext.startActivity(intent);
+ } else {
+ //跳转到登录界面
+ Intent intent = new Intent(mContext, LoginActivity.class);
+ mContext.startActivityForResult(intent, 1);
+ }
+ break;
+ case R.id.rl_course_history:
+// if (UtilsHelper.readLoginStatus(mContext)) {
+// //跳转到播放记录界面
+// Intent intent = new Intent(mContext, PlayHistoryActivity.class);
+// mContext.startActivity(intent);
+// } else {
+// Toast.makeText(mContext, "您还未登录,请先登录",
+// Toast.LENGTH_SHORT).show();
+// }
+ break;
+ case R.id.rl_setting:
+ if (UtilsHelper.readLoginStatus(mContext)) {
+ //跳转到设置界面
+ Intent intent = new Intent(mContext, SettingActivity.class);
+ mContext.startActivityForResult(intent, 1);
+ } else {
+ Toast.makeText(mContext, "您还未登录,请先登录",
+ Toast.LENGTH_SHORT).show();
+ }
+ break;
+ }
+ }
+
+ /**
+ * 设置"我"的界面中用户名控件的显示信息
+ */
+ public void setLoginParams(boolean isLogin) {
+ if (isLogin) {
+ tv_user_name.setText(UtilsHelper.readLoginUserName(mContext));
+ } else {
+ tv_user_name.setText("点击登录");
+ }
+ }
+
+ public View getView() {
+ //获取用户登录状态
+ isLogin = UtilsHelper.readLoginStatus(mContext);
+ if (mCurrentView == null) {
+
+ initView();
+ }
+ return mCurrentView;
+ }
+
+ public void showView() {
+ if (mCurrentView == null) {
+ //初始化界面控件
+ initView();
+ }
+ //设置"我"的界面为显示状态
+ mCurrentView.setVisibility(View.VISIBLE);
+ }
+}
diff --git a/app/src/main/res/drawable-hdpi/launch_bg.png b/app/src/main/res/drawable-hdpi/launch_bg.png
index 5c31efd..627e2e5 100644
Binary files a/app/src/main/res/drawable-hdpi/launch_bg.png and b/app/src/main/res/drawable-hdpi/launch_bg.png differ
diff --git a/app/src/main/res/layout/activity_modify_psw.xml b/app/src/main/res/layout/activity_modify_psw.xml
new file mode 100644
index 0000000..3c9e9a2
--- /dev/null
+++ b/app/src/main/res/layout/activity_modify_psw.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_setting.xml b/app/src/main/res/layout/activity_setting.xml
new file mode 100644
index 0000000..bb4c5ff
--- /dev/null
+++ b/app/src/main/res/layout/activity_setting.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/main_title_bar.xml b/app/src/main/res/layout/main_title_bar.xml
index 4c14c7a..4b6fdec 100644
--- a/app/src/main/res/layout/main_title_bar.xml
+++ b/app/src/main/res/layout/main_title_bar.xml
@@ -12,14 +12,24 @@
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:background="@drawable/go_back_selector" />
-
+
-
-
+ android:gravity="center"
+ android:textSize="16sp"
+ android:textColor="@android:color/white"
+ android:text="保存"
+ android:visibility="gone" />
\ No newline at end of file