安卓APP源码和设计报告——运动健身教学
實 驗 報 告
課程名稱
實驗名稱
指導教師
專業
班級
學號
姓名
目 錄
一、設計背景31. 需求分析32. 課題研究的目的和意義3二、系統需求分析與開發環境31. 系統功能需求32.系統界面需求43.開發環境4三、系統設計4四、系統測試51.腦模擬器測試6五、總結與展望6六、重要程序71.LoginActivity72.RegisterActivity123.DatabaseHelper174.DictActivity18
對于很多人來說擁有一副好身材能讓自己增添不少魅力;對于愛吃而又擔心自己發胖的人來說適當的運動是最好的選擇。移動互聯網時代,市場上“約跑”“約運動”運動指南APP軟件成為新時代閨蜜朋友的互動模式,運動熱潮的來臨,這樣讓越來越多的人加入運動的行列中,大眾的運動熱情也刺激著更多與運動有關的產業飛速發展,尤其是與“互聯網+”結合產生的智能運動運動App開發更是發展得如火如荼... 人們通過一款運動指南型App應用就可以隨時隨地的進行運動鍛煉,可以不用去運動房鍛煉也可以達到完美的身材,這樣運動運動App開發給人們帶來了極大的方便。所以這次做的是一款運動類的軟件,為了方便用戶隨時隨地可以運動。在配色方面使用白色和綠色非常簡單的顏色能讓人眼前一亮。在軟件功能方面,用戶首先需要注冊用戶名填寫密碼,注冊成功之后,用戶可以用之前注冊的用戶名和密碼進行登錄。登錄成功之后進入到導航頁面,其中包括會員信息和運動項目兩個部分,會員信息記錄了會員的姓名身高體重等一些基本信息,還可以查看用戶報名的課程名稱,可以增加以及刪除報名項目,運動項目頁面則是列舉出一些項目名稱來供用戶選擇。
所以這次做的是一款運動類的軟件,為了方便用戶隨時隨地可以運動。在配色方面使用白色和綠色非常簡單的顏色能讓人眼前一亮。在軟件功能方面,用戶首先需要注冊用戶名填寫密碼,注冊成功之后,用戶可以用之前注冊的用戶名和密碼進行登錄。登錄成功之后進入到導航頁面,其中包括會員信息和運動項目兩個部分,會員信息記錄了會員的姓名身高體重等一些基本信息,還可以查看用戶報名的課程名稱,可以增加以及刪除報名項目,運動項目頁面則是列舉出一些項目名稱來供用戶選擇。
需要包含登入注冊功能,用戶名和密碼儲存在Sharedpreferences輕型數據類中,按鈕實現頁面跳轉。包括數據庫的增刪查改功能,采用的是SQLite數據庫。
簡介美觀,采用代表健康的綠色作為主色調,和運動的主題相符合。注冊和登入的頁面參考了許多app,要讓頁面做到簡介美觀,所以登入注冊頁面都用到了自定義按鈕樣式和自定義輸入框樣式,按鈕設計出顏色漸變的樣式并加入圓角看起來不生硬,輸入框同樣加入了圓角的設計。
Android studio 4.0.2+JDK1.8+gradle-6.1.1-all.zip
登入注冊頁面制作完后,做了一個導航頁面,頁面上方可以橫向滑動運動館內部的圖片。然后是會員頁面,用戶可以通過這個頁面查詢自己會員信息,這個頁面也加入了增刪查改的功能,采用的是SQlite數據庫,方便用戶對課程時間的記錄。頁面的設計同樣采用了按鈕的自定義樣式和輸入框的自定義樣式。頁面上方是用戶的基本信息介紹,頭像部分也是設計了一個圖片樣式的自定義,給圖片添加了一個邊框,使頁面看起來和諧統一美觀。
最后是一個課程的展示界面,包括了運動館開展的全部課程,方便用戶查看和挑選。
在這次移動終端開發課程設計過程中,我發現平時學習的知識與實踐環節所用到的有一定的差距,往往我覺得自己掌握的很好或者自認為熟練的技術卻在此次實踐環節中往往出問題,書本上的知識只提供方法的借鑒,實踐中自己必須摸索出適合具體工作的方法,這一切都離不開鉆研精神與勤學好問的精神.在人與人相處過程中我收獲更大,首先要謙虛謹慎,不能自以為是,認為自己懂得很多,而僅僅埋頭苦干,而不向他人請教,工作不但是實踐與應用的過程,同時也是學習的過程,我們必須加強與他人的溝通學習,以便獲得與他人的交流。在這短短的時間里,讓我深深的感覺到自己在實際應用中所學專業知識的匱乏。讓我真真領悟到“學無止境”這句話的涵義。而老師在專業認識周中所講的,都是課本上沒有而對我們又非常實用的東西,這又給我們的實訓增加了濃墨淡采的光輝。我懂得了實際生活中,專業知識是怎樣應用與實踐的。在這些過程中,我不僅知道了職業生涯所需具備的專業知識,而且讓我深深體會到一個團隊中各成員合作的重要性,要善于團隊合作,善于利用別人的智慧,這才是大智慧。靠單一的力量是很難完成一個大項目的,在進行團隊合作的時候,還要耐心聽取每個成員的意見,使我們的組合達到更加完美。
public class LoginActivity extends AppCompatActivity {
private TextView tv_main_title;//標題
private TextView tv_back,tv_register,tv_find_psw;//返回鍵,顯示的注冊,找回密碼
private Button btn_login;//登錄按鈕
private String userName,psw,spPsw;//獲取的用戶名,密碼,加密密碼
private EditText et_user_name,et_psw;//編輯框
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
//設置此界面為豎屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
init();
}
//獲取界面控件
private void init() {
//從main_title_bar中獲取的id
tv_main_title=findViewById(R.id.tv_main_title);
tv_main_title.setText("登錄");
tv_back=findViewById(R.id.tv_back);
//從activity_login.xml中獲取的
tv_register=findViewById(R.id.tv_register);
tv_find_psw=findViewById(R.id.tv_find_psw);
btn_login=findViewById(R.id.btn_login);
et_user_name=findViewById(R.id.et_user_name);
et_psw=findViewById(R.id.et_psw);
//返回鍵的點擊事件
tv_back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//登錄界面銷毀
LoginActivity.this.finish();
}
});
//立即注冊控件的點擊事件
tv_register.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//為了跳轉到注冊界面,并實現注冊功能
Intent intent=new Intent(LoginActivity.this,RegisterActivity.class);
startActivityForResult(intent, 1);
}
});
//找回密碼控件的點擊事件
tv_find_psw.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//跳轉到找回密碼界面(此頁面暫未創建)
}
});
//登錄按鈕的點擊事件
btn_login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//開始登錄,獲取用戶名和密碼 getText().toString().trim();
userName=et_user_name.getText().toString().trim();
psw=et_psw.getText().toString().trim();
//對當前用戶輸入的密碼進行MD5加密再進行比對判斷, MD5Utils.md5( ); psw 進行加密判斷是否一致
String md5Psw= MD5Utils.md5(psw);
// md5Psw ; spPsw 為根據從SharedPreferences中用戶名讀取密碼
// 定義方法 readPsw為了讀取用戶名,得到密碼
spPsw=readPsw(userName);
// TextUtils.isEmpty
if(TextUtils.isEmpty(userName)){
Toast.makeText(LoginActivity.this, "請輸入用戶名", Toast.LENGTH_SHORT).show();
return;
}else if(TextUtils.isEmpty(psw)){
Toast.makeText(LoginActivity.this, "請輸入密碼", Toast.LENGTH_SHORT).show();
return;
// md5Psw.equals(); 判斷,輸入的密碼加密后,是否與保存在SharedPreferences中一致
}else if(md5Psw.equals(spPsw)){
//一致登錄成功
Toast.makeText(LoginActivity.this, "登錄成功", Toast.LENGTH_SHORT).show();
//保存登錄狀態,在界面保存登錄的用戶名定義個方法 saveLoginStatus boolean 狀態 , userName 用戶名;
saveLoginStatus(true, userName);
//登錄成功后關閉此頁面進入主頁
Intent data=new Intent();
//datad.putExtra( ); name , value ;
data.putExtra("isLogin",true);
//RESULT_OK為Activity系統常量,狀態碼為-1
// 表示此頁面下的內容操作成功將data返回到上一頁面,如果是用back返回過去的則不存在用setResult傳遞data值
setResult(RESULT_OK,data);
//銷毀登錄界面
LoginActivity.this.finish();
//跳轉到主界面,登錄成功的狀態傳遞到 MainActivity 中
startActivity(new Intent(LoginActivity.this,Classification.class));
return;
}else if((spPsw!=null&&!TextUtils.isEmpty(spPsw)&&!md5Psw.equals(spPsw))){
Toast.makeText(LoginActivity.this, "輸入的用戶名和密碼不一致", Toast.LENGTH_SHORT).show();
return;
}else{
Toast.makeText(LoginActivity.this, "此用戶名不存在", Toast.LENGTH_SHORT).show();
}
}
});
}
private String readPsw(String userName){
//getSharedPreferences("loginInfo",MODE_PRIVATE);
//"loginInfo",mode_private; MODE_PRIVATE表示可以繼續寫入
SharedPreferences sp=getSharedPreferences("loginInfo",?MODE_PRIVATE);
//sp.getString() userName, "";
return sp.getString(userName , "");
}
private void saveLoginStatus(boolean status,String userName){
//saveLoginStatus(true, userName);
//loginInfo表示文件名 SharedPreferences sp=getSharedPreferences("loginInfo", MODE_PRIVATE);
SharedPreferences sp=getSharedPreferences("loginInfo",?MODE_PRIVATE);
//獲取編輯器
SharedPreferences.Editor editor=sp.edit();
//存入boolean類型的登錄狀態
editor.putBoolean("isLogin", status);
//存入登錄狀態時的用戶名
editor.putString("loginUserName", userName);
//提交修改
editor.commit();
}
/**
* 注冊成功的數據返回至此
* @param requestCode 請求碼
* @param resultCode 結果碼
* @param data 數據
*/
@Override
//顯示數據, onActivityResult
//startActivityForResult(intent, 1); 從注冊界面中獲取數據
//int requestCode , int resultCode , Intent data
// LoginActivity -> startActivityForResult -> onActivityResult();
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//super.onActivityResult(requestCode, resultCode, data);
super.onActivityResult(requestCode, resultCode, data);
if(data!=null){
//是獲取注冊界面回傳過來的用戶名
// getExtra().getString("***");
String userName=data.getStringExtra("userName");
if(!TextUtils.isEmpty(userName)){
//設置用戶名到 et_user_name 控件
et_user_name.setText(userName);
//et_user_name控件的setSelection()方法來設置光標位置
et_user_name.setSelection(userName.length());
}
}
}
}
public class RegisterActivity extends AppCompatActivity {
private TextView tv_main_title;//標題
private TextView tv_back;//返回按鈕
private Button btn_register;//注冊按鈕
//用戶名,密碼,再次輸入的密碼的控件
private EditText et_user_name,et_psw,et_psw_again;
//用戶名,密碼,再次輸入的密碼的控件的獲取值
private String userName,psw,pswAgain;
//標題布局
private RelativeLayout rl_title_bar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//設置頁面布局 ,注冊界面
setContentView(R.layout.activity_register);
//設置此界面為豎屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
init();
}
private void init() {
//從main_title_bar.xml 頁面布局中獲取對應的UI控件
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.TRANSPARENT);
//從activity_register.xml 頁面中獲取對應的UI控件
btn_register=findViewById(R.id.btn_register);
et_user_name=findViewById(R.id.et_user_name);
et_psw=findViewById(R.id.et_psw);
et_psw_again=findViewById(R.id.et_psw_again);
tv_back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//返回鍵
RegisterActivity.this.finish();
}
});
//注冊按鈕
btn_register.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//獲取輸入在相應控件中的字符串
getEditString();
//判斷輸入框內容
if(TextUtils.isEmpty(userName)){
Toast.makeText(RegisterActivity.this, "請輸入用戶名", Toast.LENGTH_SHORT).show();
return;
}else if(TextUtils.isEmpty(psw)){
Toast.makeText(RegisterActivity.this, "請輸入密碼", Toast.LENGTH_SHORT).show();
return;
}else if(TextUtils.isEmpty(pswAgain)){
Toast.makeText(RegisterActivity.this, "請再次輸入密碼", Toast.LENGTH_SHORT).show();
return;
}else if(!psw.equals(pswAgain)){
Toast.makeText(RegisterActivity.this, "輸入兩次的密碼不一樣", Toast.LENGTH_SHORT).show();
return;
/**
*從SharedPreferences中讀取輸入的用戶名,判斷SharedPreferences中是否有此用戶名
*/
}else if(isExistUserName(userName)){
Toast.makeText(RegisterActivity.this, "此賬戶名已經存在", Toast.LENGTH_SHORT).show();
return;
}else{
Toast.makeText(RegisterActivity.this, "注冊成功", Toast.LENGTH_SHORT).show();
//把賬號、密碼和賬號標識保存到sp里面
/**
* 保存賬號和密碼到SharedPreferences中
*/
saveRegisterInfo(userName, psw);
//注冊成功后把賬號傳遞到LoginActivity.java中
// 返回值到loginActivity顯示
Intent data = new Intent();
data.putExtra("userName", userName);
setResult(RESULT_OK, data);
//RESULT_OK為Activity系統常量,狀態碼為-1,
// 表示此頁面下的內容操作成功將data返回到上一頁面,如果是用back返回過去的則不存在用setResult傳遞data值
RegisterActivity.this.finish();
}
}
});
}
/**
* 獲取控件中的字符串
*/
private void getEditString(){
userName=et_user_name.getText().toString().trim();
psw=et_psw.getText().toString().trim();
pswAgain=et_psw_again.getText().toString().trim();
}
/**
* 從SharedPreferences中讀取輸入的用戶名,判斷SharedPreferences中是否有此用戶名
*/
private boolean isExistUserName(String userName){
boolean has_userName=false;
//mode_private SharedPreferences sp = getSharedPreferences( );
// "loginInfo", MODE_PRIVATE
SharedPreferences sp=getSharedPreferences("loginInfo", MODE_PRIVATE);
//獲取密碼
String spPsw=sp.getString(userName, "");//傳入用戶名獲取密碼
//如果密碼不為空則確實保存過這個用戶名
if(!TextUtils.isEmpty(spPsw)) {
has_userName=true;
}
return has_userName;
}
private void saveRegisterInfo(String userName,String psw){
String md5Psw = MD5Utils.md5(psw);//把密碼用MD5加密
//loginInfo表示文件名, mode_private SharedPreferences sp = getSharedPreferences( );
SharedPreferences sp=getSharedPreferences("loginInfo", MODE_PRIVATE);
//獲取編輯器,
SharedPreferences.Editor editor -> sp.edit();
SharedPreferences.Editor editor=sp.edit();
//以用戶名為key,密碼為value保存在SharedPreferences中
//key,value,如鍵值對,editor.putString(用戶名,密碼);
editor.putString(userName, md5Psw);
//提交修改 editor.commit();
editor.commit();
}
}
public class DatabaseHelper extends SQLiteOpenHelper {
public DatabaseHelper(Context context){super(context,"Test.db",null,1);}
//第一個參數是上下文,第二個參數是數據庫名稱,
//第三個參數是CursorFactory對象,一般設置為null,第四個參數是數據庫的版本
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE information(_id INTEGER PRIMARY KEY AUTOINCREMENT,name VARCHAR(20),age INTEGER)");
}
//創建表 表名information 表結構 自增id,字符串姓名,int年齡
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.d("myDeBug","數據庫版本已更新");
}
//數據庫版本發生變化時調用
}
public class DictActivity extends AppCompatActivity {
private Button insertButton, updateButton, searchButton, deleteButton;
private Button btn_xl1;
private EditText name, age;
private TextView show, showAge;
final DatabaseHelper dbHelper = new DatabaseHelper(DictActivity.this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dict);
btn_xl1 = findViewById(R.id.btn_xl);
btn_xl1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//創建Intent 對象
Intent intent = new Intent(DictActivity.this, Classification.class);
//啟動Activity
startActivity(intent);
}
});
insertButton = findViewById(R.id.btn_insert);
updateButton = findViewById(R.id.btn_update);
searchButton = findViewById(R.id.btn_search);
deleteButton = findViewById(R.id.btn_delete);
name = findViewById(R.id.name);
age = findViewById(R.id.age);
show = findViewById(R.id.tv_show);
showAge = findViewById(R.id.tv_showAge);
SQLiteDatabase db = dbHelper.getReadableDatabase();
myShow();
insertButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", name.getText().toString());
values.put("age", age.getText().toString());
long id = db.insert("information", null, values);
Log.d("myDeBug", "insert");
myShow();
db.close();
name.setText(null);
age.setText(null);
}
});
updateButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("age", age.getText().toString());
db.update("information", values, "name=?", new String[]{name.getText().toString()});
myShow();
db.close();
Log.d("myDebug", "update");
name.setText(null);
age.setText(null);
}
});
searchButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
String name1 = name.getText().toString();
show.setText(null);
if (name1.equals("")) {
myShow();
db.close();
} else {
show.setText("項目名稱");
showAge.setText("日期");
Cursor cursor = db.rawQuery("select * from information where name = ? ", new String[]{name1});
while (cursor.moveToNext()) {
String newName = cursor.getString(cursor.getColumnIndex("name"));
int newAge = cursor.getInt(cursor.getColumnIndex("age"));
// show.setText(show.getText() + "\n" + newName + "\t" + newAge);
show.setText(show.getText() + "\n" + newName);
showAge.setText(showAge.getText() + "\n" + newAge);
}
cursor.close();
db.close();
name.setText(null);
age.setText(null);
}
}
});
deleteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.delete("information", "name=?", new String[]{name.getText().toString()});
myShow();
db.close();
Log.d("myDeBug", "DeleteSuccess");
name.setText(null);
age.setText(null);
}
});
}
public void myShow() {
SQLiteDatabase db = dbHelper.getReadableDatabase();
show.setText("項目名稱");
showAge.setText("日期");
Cursor cursor = db.rawQuery("select * from information", null);
while (cursor.moveToNext()) {
String newName = cursor.getString(cursor.getColumnIndex("name"));
int newAge = cursor.getInt(cursor.getColumnIndex("age"));
show.setText(show.getText() + "\n" + newName);
showAge.setText(showAge.getText() + "\n" + newAge);
}
cursor.close();
}
}
總結
以上是生活随笔為你收集整理的安卓APP源码和设计报告——运动健身教学的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android 原生 TabLayout
- 下一篇: 单片机编程系列之分层设计1