网站提现功能开发/seo工作职位
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 AppCompatActivityimplements FragmentsCommunicator, NavigationView.OnNavigationItemSelectedListener {String fontPath = "fonts/Questv1-Bold.otf";Toast doubleBackToast;TextView tv1;@Overrideprotected 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 FaceTypeface 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 valuepublic 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 stackendIntent.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 preferenceseditor.clear();Intent clearIntent = new Intent(this, MainActivity .class);//clear back stackclearIntent.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 methodprivate 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 fragmentft.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 Fragmentspublic 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;}/* ############################################################################################# */@Overridepublic 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;}@Overridepublic 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 flagstartActivity(refresh);finish();}return super.onOptionsItemSelected(item);}@SuppressWarnings("StatementWithEmptyBody")@Overridepublic 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();}/* ############################################################################################ */@Overridepublic 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;@Overrideprotected 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>{@Overrideprotected 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 InputStreamReaderInputStreamReader streamReader = new InputStreamReader(connection.getInputStream());//Create a new buffered reader and String BuilderBufferedReader reader = new BufferedReader(streamReader);String inputLine;StringBuilder stringBuilder = new StringBuilder();//Check if the line we are reading is not nullwhile((inputLine = reader.readLine()) != null){stringBuilder.append(inputLine);}reader.close();streamReader.close();allStrings = stringBuilder.toString();publishProgress(allStrings);}catch(Exception e){}return "";}@Overrideprotected 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;@Overrideprotected 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);}@Overridepublic 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
创作不易,项目已加密,有偿(仅一杯奶茶钱,可做实验报告,代码讲解等…)
请私信作者或
(v)15135757306
相关文章:

Android安卓实战项目(12)—关于身体分析,BMI计算,喝水提醒,食物卡路里计算APP【支持中英文切换】生活助手类APP(源码在文末)
Android安卓实战项目(12)—关于身体分析,BMI计算,喝水提醒,食物卡路里计算APP【支持中英文切换】生活助手类APP(源码在文末🐕🐕🐕) 一.项目运行介绍 B站演示…...

Hadoop 3.2.4 集群搭建详细图文教程
目录 一、集群简介 二、Hadoop 集群部署方式 三、集群安装 3.1 集群角色规划 3.2 服务器基础环境准备 3.2.1 环境初始化 3.2.2 ssh 免密登录(在 hadoop01 上执行) 3.2.3 各个节点上安装 JDK 1.8 环境 3.3 安装 Hadoop 3.4 Hadoop 安装包目…...

STL的学习之一
1)STL扫盲 1)C标准库和标准模板库是不一样的 2)标准模板库是用泛型编程方式编写的函数或者类库; 3) SGI STL linux一般用,P.J.Plauger STL,visual2017 windows用 STL六大组件 : 容器,迭代器 STL 算法(说白了就是函数…...

如何使用Python进行数据科学实验?
使用Python进行数据科学实验通常需要以下步骤: 以上仅为使用Python进行数据科学实验的基本步骤,具体实验过程会根据具体问题和数据集的特点而有所不同。可以进一步学习和探索相关的数据科学和机器学习技术,以提高实验的效果和表现。 安装Pyt…...

华为数通方向HCIP-DataCom H12-821题库(拖拽题,知识点总结)
以下是我在现有题库中整理的需要重点关注的考点内容,如有遗漏小伙伴可以留言补充。...

第三课:C++实现PDF去水印
PDF去水印是一项非常复杂的任务,需要一定的计算机图形学知识和技术,也需要使用到一些专业的工具库。以下是一种可能的实现方法: 首先,需要将PDF文件解析成一系列图形元素,包括文字、矢量图形等。可以使用开源库Poppler或MuPDF来解析PDF文件。 接下来,需要判断PDF文件是否…...

实现Android分布式协同办公:将待办事件App与本地Web服务结合
AndServer AndServer 是 Android 平台的 Web Server 和 Web Framework,它基于编译时注解提供了类似 SpringMVC 的注解和功能。 Github :https://github.com/yanzhenjie/AndServer使用文档:https://yanzhenjie.com/AndServer/业务需求 实现待办事件APP本地启动Web服务,将本…...

VMware12.1.1安装Centos7
VMware12.1.1安装Centos7 1、下载相关软件 1.1 Centos7下载 官方下载链接: http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1511.iso 1.2 VMware Workstation下载 VMware Workstation 12.1.1官方原版下载: https://dow…...

bazel构建原理
调度模型 传统构建系统有很多是基于任务的,例如 Ant,Maven,Gradle。用户可以自定义"任务"(Task),例如执行一段 shell 脚本。用户配置它们的依赖关系,构建系统则按照顺序调度。 基于 Task 的调度…...

matlab 点云的二进制形状描述子
目录 一、功能概述1、算法概述2、主要函数3、参考文献二、代码示例三、结果展示四、参数解析输入参数名称-值对应参数输出参数五、参考链接本文由CSDN点云侠原创,...

MongoDB实验——在Java应用程序中操作 MongoDB 数据
在Java应用程序中操作 MongoDB 数据 1. 启动MongoDB Shell 2. 切换到admin数据库,使用root账户 3.开启Eclipse,创建Java Project项目,命名为MongoJava File --> New --> Java Project 4.在MongoJava项目下新建包,包名为mo…...

java+springboot+mysql校园跑腿管理系统
项目介绍: 使用javaspringbootmysql开发的校园跑腿管理系统,系统包含超级管理员,系统管理员、用户角色,功能如下: 超级管理员:管理员管理;用户管理(充值);任…...

ubuntu20.04 server 安装后磁盘空间只有一半的处理
这里扩展:/dev/mapper/ubuntu–vg-ubuntu–lv rootbook:/data# df -h Filesystem Size Used Avail Use% Mounted on udev 3.9G 0 3.9G 0% /dev tmpfs 795M 1.2M 79…...

〔017〕Stable Diffusion 之 常用模型推荐 篇
✨ 目录 🎈 模型网站🎈 仿真系列🎈 国风系列🎈 卡通动漫系列🎈 3D系列🎈 一些好用的lora模型🎈 模型网站 由于现在大模型超级多,导致每种画风的模型太多,那么如何选择最好最适合的模型,成了很多人头疼的问题由于用的大部分都是1.5的模型,所以优先下载 safete…...

多目标应用:基于多目标人工蜂鸟算法(MOAHA)的微电网多目标优化调度MATLAB
一、微网系统运行优化模型 参考文献: [1]李兴莘,张靖,何宇,等.基于改进粒子群算法的微电网多目标优化调度[J].电力科学与工程, 2021, 37(3):7 二、多目标人工蜂鸟算法MOAHA 多目标人工蜂鸟算法(multi-objective artificial hummingbird algorithm&…...

【HTML5】HTML5 特性
HTML5 特性 1. 语义化标签 <header>:表示网页或某个区域的页眉部分,通常包含网站的标志、导航菜单等内容。<nav>:表示导航区域,用于包含网站的主要导航链接。<main>:表示网页的主要内容区域&#…...

【FreeRTOS】互斥量的使用与逐步实现
在FreeRTOS中,互斥量是一种用于保护共享资源的同步机制。它通过二进制信号量的方式,确保在任意时刻只有一个任务可以获取互斥量并访问共享资源,其他任务将被阻塞。使用互斥量的基本步骤包括创建互斥量、获取互斥量、访问共享资源和释放互斥量…...

Spring-Cloud-Openfeign如何传递用户信息?
用户信息传递 微服务系统中,前端会携带登录生成的token访问后端接口,请求会首先到达网关,网关一般会做token解析,然后把解析出来的用户ID放到http的请求头中继续传递给后端的微服务,微服务中会有拦截器来做用户信息的…...

OpenCV(十一):图像仿射变换
目录 1.图像仿射变换介绍 仿射变换: 仿射变换矩阵: 仿射变换公式: 2.仿射变换函数 仿射变换函数:warpAffine() 图像旋转:getRotationMatrix2D() 计算仿射变换矩阵:getAffineTransform() 3.demo 1.…...

多路波形发生器的控制
本次波形发生器,主要使用运算放大器、NE555以及一些其他的电阻电容器件来实现。整体电路图如下所示: 产生的三角波如下: 正弦波如下 方波如下: 运算放大器(Operational Amplifier,简称OP-AMP)是…...

[C/C++]天天酷跑超详细教程-中篇
个人主页:北海 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏✨收录专栏:C/C🤝希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!ǹ…...

面试被打脸,数据结构底层都不知道么--回去等通知吧
数据结构之常见的8种数据结构: -数组Array -链表 Linked List -堆 heap -栈 stack -队列 Queue -树 Tree -散列表 Hash -图 Graph 数据结构-链表篇 Linklist定义: -是一种线性表,并不会按线性的顺序存储数据,即逻辑上相邻…...

微服务面试问题小结( 微服务、分布式、MQ、网关、zookeeper、nginx)
什么是微服务,单体架构的优点和缺点,微服务架构的优点和缺点? 单体架构 优点:架构简单,维护成本低缺点:各个模块耦合度太高,当对一个模块进行更新修改时,会影响到其他模块ÿ…...

Vue3全局变量使用
全局变量(函数等)可以在任意组件内访问,可以当组件间的传值使用。 main.js import ./assets/main.cssimport { createApp } from vue import App from ./App.vueconst app createApp(App); app.config.globalProperties.$global_id10; app.…...

拼多多海量商品数据接口API 商品详情接口 商品价格主图接口
拼多多,作为中国最大的社交电商之一,提供了丰富的商品信息和海量的用户数据。对于广大开发者而言,如何快速、准确地获取这些数据,进而开发出各种创新应用,是他们关心的问题。本文将详细介绍拼多多海量商品数据接口API的…...

结构化日志记录增强网络安全性
日志是一种宝贵的资产,在监视和分析应用程序或组织的 IT 基础结构的整体安全状况和性能方面发挥着至关重要的作用。它们提供系统事件、用户活动、网络流量和应用程序行为的详细记录,从而深入了解潜在威胁或未经授权的访问尝试。虽然组织历来依赖于传统的…...

企业架构LNMP学习笔记5
Nginx: 常见用法: 1)web服务器软件 httpd http协议 同类的web服务器软件:apache Nginx(俄罗斯)IIS(微软)lighttpd(德国) 2)代理服务器 反向代…...

Idea安装免注册版ChatGPT
文章目录 一、前期准备二、开始使用 一、前期准备 1.准备Idea开发软件并打开(VS Code同理)! 2.【CtrlAltS】快捷键调出Settings窗口,如图 3.找到NexChatGPT 此插件不需要注册,可以直接使用(高级一些的需要会员收费限…...

git操作
一、查看远程分支 使用如下git命令查看所有远程分支: git branch -r 查看远程和本地所有分支: git branch -a 查看本地分支: git branch 在输出结果中,前面带* 的是当前分支。 二、拉取远程分支并创建本地分支 方法一 使用如下…...

9 | 求出不同性别和不同科目的学生平均分数
需求描述:学生成绩分析 背景: 我们有一组学生的成绩数据,其中包括学生的姓名、性别和科目,我们需要分析不同性别和不同科目的学生平均分数。 功能要求: 从数据源中获取学生的成绩数据,包括学生姓名、性别和科目。使用Spark进行数据处理,将学生数据按性别和科目分组。计…...