Android安卓实战项目(12)—关于身体分析,BMI计算,喝水提醒,食物卡路里计算APP【支持中英文切换】生活助手类APP(源码在文末🐕🐕🐕)
一.项目运行介绍
B站演示
【Android安卓实战项目(12)—生活助手类APP—关于身体分析,BMI计算,喝水提醒,食物卡路里计算APP【支持中英文切换】】
https://www.bilibili.com/video/BV1Wu4y1C76j/?share_source=copy_web&vd_source=b2e9b9ed746acda34f499009647748ed
1.开机动画
2.主页面
3.侧边栏
4.身体分析
5.分析结果
6.显示分析
7.食物热量计算
8.喝水提醒
二.具体实现
1.MainActivity
package ahmux.nutritionpoint;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.graphics.Typeface;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.DisplayMetrics;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.Switch;
import android.widget.TextView;
import android.widget.Toast;
import java.lang.reflect.Array;
import java.util.Locale;
public class MainActivity extends AppCompatActivity
implements FragmentsCommunicator, NavigationView.OnNavigationItemSelectedListener {
String fontPath = "fonts/Questv1-Bold.otf";
Toast doubleBackToast;
TextView tv1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
tv1 = (TextView) findViewById(R.id.textView1);
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.addDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
loadLocale();
saveData();
waterReminder();
// Loading Font Face
Typeface tf = Typeface.createFromAsset(getAssets(), fontPath);
tv1.setTypeface(tf);
doubleBackToast = Toast.makeText(this,
R.string.doubleBackToast, Toast.LENGTH_LONG);
}
/* ######### Communicate with Fragments ######################################################## */
@Override
//data1 is key, data2 is value
public void respond(String data1, int data2) {
SharedPreferences sharedPreferences = getSharedPreferences("UserData", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
switch (data1){
case("male"):
editor.putString("gender", getString(R.string.Male));
loadFragment(new Fragment2(), R.id.fullparentFramelayout);
break;
case("female"):
editor.putString("gender", getString(R.string.Female));
loadFragment(new Fragment2(),R.id.fullparentFramelayout);
break;
case("no activity"):
editor.putString("physical_activity", "no activity");
loadFragment(new Fragment3(), R.id.fullparentFramelayout);
break;
case("walking"):
editor.putString("physical_activity", "walking");
loadFragment(new Fragment3(), R.id.fullparentFramelayout);
break;
case("exercize 1-2 days"):
loadFragment(new Fragment3(),R.id.fullparentFramelayout);
break;
case("exercize 3-5 days"):
loadFragment(new Fragment3(), R.id.fullparentFramelayout);
break;
case("everyday"):
loadFragment(new Fragment3(), R.id.fullparentFramelayout);
break;
case("age"):
editor.putString("age", String.valueOf(data2));
break;
case("weight"):
editor.putString("weight", String.valueOf(data2));
break;
case("height"):
editor.putString("height", String.valueOf(data2));
break;
case("analyze"):
loadFragment(new Fragment4(),R.id.fullparentFramelayout);
break;
case("ok"):
Intent endIntent = new Intent(this, MainActivity .class);
//set flags to clear back stack
endIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(endIntent);
break;
case("clear"):
Toast.makeText(this, "DATA CLEARED", Toast.LENGTH_SHORT).show();
//clear data from shared preferences
editor.clear();
Intent clearIntent = new Intent(this, MainActivity .class);
//clear back stack
clearIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(clearIntent);
break;
case("show"):
loadFragment(new Fragment4(),R.id.fullparentFramelayout);
break;
}
editor.commit();
}
//Fragments loading method
private void loadFragment(Fragment f, int layoutId) {
android.support.v4.app.FragmentManager fm = getSupportFragmentManager();
android.support.v4.app.FragmentTransaction ft = fm.beginTransaction();
ft.replace(layoutId, f);
ft.addToBackStack(null); // press back to go to previous fragment
ft.commit();
}
/* ############################################################################################# */
/* #############Saving data in Shared Preferences############################################### */
private void saveData() {
SharedPreferences sharedPreferences = getSharedPreferences("UserData", Context.MODE_PRIVATE);
String gender = sharedPreferences.getString("gender", "N/A");
String activity = sharedPreferences.getString("physical_activity", "N/A");
String age = sharedPreferences.getString("age", "N/A");
String weight = sharedPreferences.getString("weight", "N/A");
String height = sharedPreferences.getString("height", "N/A");
//choose start fraagment or End!
android.support.v4.app.FragmentManager fm = getSupportFragmentManager();
android.support.v4.app.FragmentTransaction ft = fm.beginTransaction();
if (age.matches("N/A")) {
ft.replace(R.id.mainFrameLayout, new Fragment1());
ft.commit();
} else {
ft.replace(R.id.mainFrameLayout, new Fragment5());
ft.commit();
}
}
//Send data to Fragments
public String getMyData(String s) {
String myString = s;
SharedPreferences sharedPreferences = getSharedPreferences("UserData", Context.MODE_PRIVATE);
switch (s){
case("gender"):
myString = sharedPreferences.getString("gender", null);
break;
case("age"):
myString = sharedPreferences.getString("age", null);
break;
case("weight"):
myString = sharedPreferences.getString("weight", null);
break;
case("height"):
myString = sharedPreferences.getString("height", null);
break;
}
return myString;
}
/* ############################################################################################# */
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_about) {
loadFragment(new AboutFragment(), R.id.fullparentFramelayout);
return true;
}
else if (id == R.id.action_language){
String langPref = "Language";
SharedPreferences sharedPreferences = getSharedPreferences("SettingsData", Activity.MODE_PRIVATE);
String language = sharedPreferences.getString(langPref, "en");
if(language.matches("ar")){
changeLang("en");
}else{
changeLang("ar");
}
Intent refresh = new Intent(this, MainActivity.class);
refresh.setFlags(refresh.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY); // Adds the FLAG_ACTIVITY_NO_HISTORY flag
startActivity(refresh);
finish();
}
return super.onOptionsItemSelected(item);
}
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
if (id == R.id.nav_home) {
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
} else if (id == R.id.nav_reminder) {
Intent RemindersIntent = new Intent(this, RemindersActivity.class);
startActivity(RemindersIntent);
} else if (id == R.id.nav_Recipes) {
} else if (id == R.id.nav_calculate) {
Intent ApiIntent = new Intent(this, ApiActivity.class);
startActivity(ApiIntent);
} else if (id == R.id.nav_share) {
} else if (id == R.id.nav_facebook) {
try {
Intent fbIntent = new Intent(Intent.ACTION_VIEW);
fbIntent.setData(Uri.parse("https://www.facebook.com/supportnutritionpoit"));
startActivity(fbIntent);
} catch (Exception e) {
}
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
/* ###### Water Reminder ######################################################################3 */
public void waterReminder(){
SharedPreferences sharedPreferences = getSharedPreferences("SettingsData", Activity.MODE_PRIVATE);
int t = sharedPreferences.getInt("water_delay", 1000);
if(sharedPreferences.getString("water_reminder", "false").matches("true")){
AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
Intent alarmIntent = new Intent(this, AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this,0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),t*60*1000, pendingIntent);
}
}
/* ############################################################################################ */
/* #########Change Language and restart Main Activity########################################### */
public void loadLocale() {
String langPref = "Language";
SharedPreferences sharedPreferences = getSharedPreferences("SettingsData", Activity.MODE_PRIVATE);
String language = sharedPreferences.getString(langPref, "");
changeLang(language);
}
public void changeLang(String lang) {
if (lang.equalsIgnoreCase(""))
return;
Locale myLocale = new Locale(lang, "MR");
saveLocale(lang);
Locale.setDefault(myLocale);
android.content.res.Configuration config = new android.content.res.Configuration();
config.locale = myLocale;
getBaseContext().getResources().updateConfiguration(config,getBaseContext().getResources().getDisplayMetrics());
}
public void saveLocale(String lang) {
String langPref = "Language";
SharedPreferences sharedPreferences = getSharedPreferences("SettingsData", Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(langPref, lang);
editor.commit();
}
/* ############################################################################################ */
@Override
public void onBackPressed() {
int backStackEntryCount = getSupportFragmentManager().getBackStackEntryCount();
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
}
/* ##### press back twice to exit method #################################// */
else if (backStackEntryCount == 0) {
if (doubleBackToast.getView().isShown()) {
if (doubleBackToast != null) {
doubleBackToast.cancel();
super.onBackPressed();
}
}
doubleBackToast.show();
}else {
super.onBackPressed();
}
/* ######################################################################// */
}
}
这段代码是一个Android应用程序的主要活动(Activity),它是一个基于导航抽屉(Navigation Drawer)的应用,用于管理用户的营养信息。下面我会对代码的各个部分进行详细解释:
-
导入必要的类:
代码开始处导入了一些Android的类,这些类用于构建应用界面、处理用户操作和管理数据。这些类包括Activity、Fragment、Intent等等。 -
MainActivity类继承自AppCompatActivity:
这是应用的主要活动类,用于展示应用的界面、处理用户输入和管理应用逻辑。 -
onCreate方法:
这个方法是Activity生命周期的一部分,在Activity首次创建时被调用。在这个方法中,进行了许多初始化操作,如设置布局、工具栏、导航抽屉等。 -
Fragment通信:
在代码中定义了一个接口FragmentsCommunicator
,用于在Activity和Fragments之间进行通信。respond
方法根据接收到的不同数据,进行相关的逻辑处理和Fragment的加载。 -
数据保存和获取:
通过SharedPreferences,数据被保存在应用的持久存储中,以便在应用重启后可以恢复。saveData
方法用于根据已保存的数据判断是加载起始Fragment还是结束Fragment,getMyData
方法用于从SharedPreferences获取特定的用户数据。 -
菜单和选项:
通过onCreateOptionsMenu
方法创建应用菜单,通过onOptionsItemSelected
方法处理选项菜单的点击事件,比如切换语言、显示关于界面等。 -
抽屉导航点击事件:
通过onNavigationItemSelected
方法处理导航抽屉中的选项点击事件,根据点击的选项执行不同的操作,如返回主页面、打开提醒页面、切换语言等。 -
水量提醒功能:
waterReminder
方法用于设置水量提醒的闹钟,根据用户的设置,周期性地触发提醒。 -
语言切换:
loadLocale
方法用于加载用户选择的语言设置,changeLang
方法用于实际改变应用的语言,并重新加载界面。 -
返回按钮行为:
onBackPressed
方法重写了返回按钮的行为,实现了“双击返回退出”功能,以及处理Fragment的回退。 -
其他细节:
代码中还包括了加载字体、设置文本样式、处理Facebook链接等其他细节功能。
2.ApiActivity.java
package ahmux.nutritionpoint;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class ApiActivity extends AppCompatActivity {
String food;
EditText et;
TextView tv1, tv2,tv3, tv4, tv5;
View v1, v2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_api);
et = (EditText)findViewById(R.id.editText);
tv1 = (TextView)findViewById(R.id.textView13);
tv2 = (TextView)findViewById(R.id.textView16);
tv3 = (TextView)findViewById(R.id.textView17);
tv4 = (TextView)findViewById(R.id.textView18);
tv5 = (TextView)findViewById(R.id.textView19);
}
public void calculateClk(View view) {
food = et.getText().toString();
Toast.makeText(this, "Searching...", Toast.LENGTH_SHORT).show();
new MyAsyncTask().execute();
}
/* #####AsyncTask Subclass################################################################### */
private class MyAsyncTask extends AsyncTask<String, String, String>{
@Override
protected String doInBackground(String... strings) {
String allStrings;
try{
URL myUrl = new URL("https://api.nutritionix.com/v1_1/search/" +
food +"?fields=item_name%2Citem_id%2Cnf_calories%2Cnf_total_fat" +
"&appId=3fe5fa47&appKey=61729b9d2d8612a629467f0cdbbd6d2c");
HttpURLConnection connection =(HttpURLConnection) myUrl.openConnection();
connection.setConnectTimeout(700);
connection.connect();
//Create a new InputStreamReader
InputStreamReader streamReader = new InputStreamReader(connection.getInputStream());
//Create a new buffered reader and String Builder
BufferedReader reader = new BufferedReader(streamReader);
String inputLine;
StringBuilder stringBuilder = new StringBuilder();
//Check if the line we are reading is not null
while((inputLine = reader.readLine()) != null){
stringBuilder.append(inputLine);
}
reader.close();
streamReader.close();
allStrings = stringBuilder.toString();
publishProgress(allStrings);
}catch(Exception e){}
return "";
}
@Override
protected void onProgressUpdate(String... values) {
try {
JSONObject j = new JSONObject(values[0]);
JSONArray h= (JSONArray) j.get("hits");
JSONObject rec = h.getJSONObject(0);
JSONObject fields = rec.getJSONObject("fields");
String calories = fields.getString("nf_calories");
String fat = fields.getString("nf_total_fat");
String name = fields.getString("item_name");
tv2.setText("Nutrition Facts");
tv3.setText("Amount: " + name);
tv4.setText("Calories: " +calories);
tv5.setText("Total Fat: " + fat);
v1 = findViewById(R.id.view);
v1.setVisibility(View.VISIBLE);
v2 = findViewById(R.id.view);
v2.setVisibility(View.VISIBLE);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
}
这段代码是一个Android应用中的Java类,用于从一个外部的API获取食物的营养信息,并在界面上显示出来。我会逐步解释每个部分的功能和作用。
-
导入库和包:代码开头导入了一些需要的库和包,用于支持Android应用的开发和功能实现。
-
类定义:定义了一个名为
ApiActivity
的类,继承自AppCompatActivity
,即用于创建一个与Android界面交互的活动(Activity)。 -
成员变量的声明:在类内部,声明了一系列的成员变量,用于存储界面上的控件和数据。例如,
String food
用于存储食物名称,EditText et
用于获取用户输入的食物名称,TextView
类型的tv1
,tv2
,tv3
,tv4
,tv5
用于显示不同的文本信息,View v1
和View v2
则是视图元素。 -
onCreate
方法:这是Android活动的生命周期方法之一,会在活动创建时被调用。在这里,首先设置了界面的布局,然后通过findViewById
方法获取布局中的各个控件,将它们和之前声明的成员变量进行关联。 -
calculateClk
方法:这个方法是在用户点击某个按钮时触发的,它从EditText
控件中获取用户输入的食物名称,显示一个短时的提示消息,然后创建并执行一个异步任务MyAsyncTask
来获取营养信息。 -
MyAsyncTask
内部类:这是一个内部类,继承自AsyncTask
,用于在后台执行网络请求和数据处理操作。-
doInBackground
方法:在后台线程执行,它首先构建一个URL来访问特定的API,然后通过HTTP连接获取API返回的数据。这部分操作是在后台进行的,以避免在主线程上进行网络请求,防止应用界面的卡顿。获取的数据被转化为字符串并通过publishProgress
发送到主线程更新。 -
onProgressUpdate
方法:在主线程执行,用于处理后台任务的进度更新。在这里,获取的字符串数据被解析为JSON对象,然后从中提取出营养信息,最后将这些信息设置到界面上的TextView
控件中,并显示一些视图元素。
-
总的来说,这段代码实现了以下功能:
- 用户在输入框中输入食物名称,点击按钮后,应用通过网络请求从特定API获取食物的营养信息。
- 营养信息包括名称、卡路里和总脂肪,并将这些信息显示在界面上的
TextView
控件中。 - 异步任务的使用确保了网络请求等耗时操作不会阻塞应用的主线程,保持了应用的响应性。
3.RemindersActivity.java
package ahmux.nutritionpoint;
/* ######################################## */
/* Nutrition Point App developed by Ahmux */
/* ##### Ahmux.freelander@gmail.com ###### */
/* ######################################## */
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class RemindersActivity extends AppCompatActivity implements View.OnClickListener {
Button b1,b2, b3, b4, b5,b6,b7;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_reminders);
ActionBar actionBar = getSupportActionBar();
actionBar.setTitle(R.string.reminders_title);
SharedPreferences sharedPreferences = getSharedPreferences("SettingsData", Activity.MODE_PRIVATE);
b1 = (Button)findViewById(R.id.min15Btn);
b1.setOnClickListener(this);
b2 = (Button)findViewById(R.id.min30Btn);
b2.setOnClickListener(this);
b3 = (Button)findViewById(R.id.h1Btn);
b3.setOnClickListener(this);
b4 = (Button)findViewById(R.id.h2Btn);
b4.setOnClickListener(this);
b5 = (Button)findViewById(R.id.h4Btn);
b5.setOnClickListener(this);
b6 = (Button)findViewById(R.id.startBtn);
b6.setOnClickListener(this);
b7 = (Button)findViewById(R.id.stopBtn);
b7.setOnClickListener(this);
}
@Override
public void onClick(View view) {
SharedPreferences sharedPreferences = getSharedPreferences("SettingsData", Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
int delay = sharedPreferences.getInt("water_delay", 300);
if (view.getId() == R.id.min15Btn || delay == 15){
editor.putInt("water_delay", 15);
b1.setTextColor(Color.parseColor("#FFCC00"));
b2.setTextColor(Color.WHITE);
b3.setTextColor(Color.WHITE);
b4.setTextColor(Color.WHITE);
b5.setTextColor(Color.WHITE);
}
else if (view.getId() == R.id.min30Btn || delay == 30){
editor.putInt("water_delay", 30);
b1.setTextColor(Color.WHITE);
b2.setTextColor(Color.parseColor("#FFCC00"));
b3.setTextColor(Color.WHITE);
b4.setTextColor(Color.WHITE);
b5.setTextColor(Color.WHITE);
}
else if (view.getId() == R.id.h1Btn || delay == 60){
editor.putInt("water_delay", 60);
b1.setTextColor(Color.WHITE);
b2.setTextColor(Color.WHITE);
b3.setTextColor(Color.parseColor("#FFCC00"));
b4.setTextColor(Color.WHITE);
b5.setTextColor(Color.WHITE);
}
else if (view.getId() == R.id.h2Btn || delay == 120){
editor.putInt("water_delay", 120);
b1.setTextColor(Color.WHITE);
b2.setTextColor(Color.WHITE);
b3.setTextColor(Color.WHITE);
b4.setTextColor(Color.parseColor("#FFCC00"));
b5.setTextColor(Color.WHITE);
}
else if (view.getId() == R.id.h4Btn || delay == 240){
editor.putInt("water_delay", 240);
b1.setTextColor(Color.WHITE);
b2.setTextColor(Color.WHITE);
b3.setTextColor(Color.WHITE);
b4.setTextColor(Color.parseColor("#FFCC00"));
b5.setTextColor(Color.WHITE);
}
else if (view.getId() == R.id.startBtn){
AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
Intent alarmIntent = new Intent(this, AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this,0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),delay*60*1000, pendingIntent);
editor.putString("water_reminder", "true");
}
else if (view.getId() == R.id.stopBtn){
editor.putString("water_reminder", "false");
AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
Intent alarmIntent = new Intent(this, AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this,0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.cancel(pendingIntent);
Toast.makeText(this, "Water Reminders Stopped", Toast.LENGTH_SHORT).show();
}
}
}
这段代码是一个Android应用中的Java类,它似乎是一个提醒用户喝水的功能部分。下面我将对代码的不同部分进行详细解释:
-
导入库和声明类:
-
import
语句用于导入所需的类和库,让你可以在代码中使用它们。 -
package ahmux.nutritionpoint;
声明了当前类所在的包名。 -
public class RemindersActivity extends AppCompatActivity implements View.OnClickListener
声明了一个名为RemindersActivity
的类,它继承自AppCompatActivity
类,并实现了View.OnClickListener
接口。
-
-
成员变量声明:
-
Button b1, b2, b3, b4, b5, b6, b7;
声明了七个按钮对象的成员变量,这些按钮将用于用户与界面交互。
-
-
onCreate
方法:-
onCreate
是 Android 生命周期中的一个方法,在创建 Activity 时被调用。在这里,你进行了一些初始化操作。 -
setContentView(R.layout.activity_reminders);
设置当前 Activity 使用的布局文件为activity_reminders.xml
。 - 通过
getSupportActionBar()
获取应用的操作栏,并设置标题为 “reminders_title” 字符串资源的值。 - 获取名为 “SettingsData” 的共享偏好设置实例。
-
-
按钮初始化和点击事件:
- 初始化了七个按钮对象,并分别为它们设置了点击监听器。
- 当用户点击按钮时,相应的
onClick
方法将被调用。
-
onClick
方法:- 在用户点击按钮时触发的方法,这个方法实现了对不同按钮的响应操作。
- 首先,获取共享偏好设置实例和编辑器。
- 根据用户点击的按钮或者已经保存的延迟时间,修改偏好设置中的 “water_delay” 值。
- 根据点击的按钮,修改按钮的文本颜色以进行视觉提示。
- 如果用户点击了 “startBtn”,设置一个重复性闹钟,以提醒用户喝水。
- 如果用户点击了 “stopBtn”,取消之前设置的闹钟,并显示一个提示信息。
这段代码实现了一个界面,用户可以点击不同的按钮来设置提醒的时间间隔,以及开始和停止喝水提醒的功能。
三.项目源码
链接:https://pan.baidu.com/s/1Ydtv31fBAuenfCQJeJCeOw?pwd=0616
提取码:0616
创作不易,项目已加密,有偿(仅一杯奶茶钱,可做实验报告,代码讲解等…)
请私信作者或文章来源:https://www.toymoban.com/news/detail-688649.html
(v)15135757306文章来源地址https://www.toymoban.com/news/detail-688649.html
到了这里,关于Android安卓实战项目(12)—关于身体分析,BMI计算,喝水提醒,食物卡路里计算APP【支持中英文切换】生活助手类APP(源码在文末)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!