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

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.开机动画

60ab1e73a75361bcbbff6ca7d80c6c5

2.主页面

image-20230831093217711

3.侧边栏

image-20230831093225406

4.身体分析

image-20230831093239408

5.分析结果

image-20230831093246484

image-20230831093254082

6.显示分析

image-20230831093306291

7.食物热量计算

image-20230831093406559

8.喝水提醒

image-20230831093301687

二.具体实现

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)的应用,用于管理用户的营养信息。下面我会对代码的各个部分进行详细解释:

  1. 导入必要的类:
    代码开始处导入了一些Android的类,这些类用于构建应用界面、处理用户操作和管理数据。这些类包括Activity、Fragment、Intent等等。

  2. MainActivity类继承自AppCompatActivity:
    这是应用的主要活动类,用于展示应用的界面、处理用户输入和管理应用逻辑。

  3. onCreate方法:
    这个方法是Activity生命周期的一部分,在Activity首次创建时被调用。在这个方法中,进行了许多初始化操作,如设置布局、工具栏、导航抽屉等。

  4. Fragment通信:
    在代码中定义了一个接口FragmentsCommunicator,用于在Activity和Fragments之间进行通信。respond方法根据接收到的不同数据,进行相关的逻辑处理和Fragment的加载。

  5. 数据保存和获取:
    通过SharedPreferences,数据被保存在应用的持久存储中,以便在应用重启后可以恢复。saveData方法用于根据已保存的数据判断是加载起始Fragment还是结束Fragment,getMyData方法用于从SharedPreferences获取特定的用户数据。

  6. 菜单和选项:
    通过onCreateOptionsMenu方法创建应用菜单,通过onOptionsItemSelected方法处理选项菜单的点击事件,比如切换语言、显示关于界面等。

  7. 抽屉导航点击事件:
    通过onNavigationItemSelected方法处理导航抽屉中的选项点击事件,根据点击的选项执行不同的操作,如返回主页面、打开提醒页面、切换语言等。

  8. 水量提醒功能:
    waterReminder方法用于设置水量提醒的闹钟,根据用户的设置,周期性地触发提醒。

  9. 语言切换:
    loadLocale方法用于加载用户选择的语言设置,changeLang方法用于实际改变应用的语言,并重新加载界面。

  10. 返回按钮行为:
    onBackPressed方法重写了返回按钮的行为,实现了“双击返回退出”功能,以及处理Fragment的回退。

  11. 其他细节:
    代码中还包括了加载字体、设置文本样式、处理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获取食物的营养信息,并在界面上显示出来。我会逐步解释每个部分的功能和作用。

  1. 导入库和包:代码开头导入了一些需要的库和包,用于支持Android应用的开发和功能实现。

  2. 类定义:定义了一个名为 ApiActivity 的类,继承自 AppCompatActivity,即用于创建一个与Android界面交互的活动(Activity)。

  3. 成员变量的声明:在类内部,声明了一系列的成员变量,用于存储界面上的控件和数据。例如,String food 用于存储食物名称,EditText et 用于获取用户输入的食物名称,TextView 类型的 tv1, tv2, tv3, tv4, tv5 用于显示不同的文本信息,View v1View v2 则是视图元素。

  4. onCreate 方法:这是Android活动的生命周期方法之一,会在活动创建时被调用。在这里,首先设置了界面的布局,然后通过 findViewById 方法获取布局中的各个控件,将它们和之前声明的成员变量进行关联。

  5. calculateClk 方法:这个方法是在用户点击某个按钮时触发的,它从 EditText 控件中获取用户输入的食物名称,显示一个短时的提示消息,然后创建并执行一个异步任务 MyAsyncTask 来获取营养信息。

  6. 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类,它似乎是一个提醒用户喝水的功能部分。下面我将对代码的不同部分进行详细解释:

  1. 导入库和声明类:

    • import 语句用于导入所需的类和库,让你可以在代码中使用它们。
    • package ahmux.nutritionpoint; 声明了当前类所在的包名。
    • public class RemindersActivity extends AppCompatActivity implements View.OnClickListener 声明了一个名为 RemindersActivity 的类,它继承自 AppCompatActivity 类,并实现了 View.OnClickListener 接口。
  2. 成员变量声明:

    • Button b1, b2, b3, b4, b5, b6, b7; 声明了七个按钮对象的成员变量,这些按钮将用于用户与界面交互。
  3. onCreate 方法:

    • onCreate 是 Android 生命周期中的一个方法,在创建 Activity 时被调用。在这里,你进行了一些初始化操作。
    • setContentView(R.layout.activity_reminders); 设置当前 Activity 使用的布局文件为 activity_reminders.xml
    • 通过 getSupportActionBar() 获取应用的操作栏,并设置标题为 “reminders_title” 字符串资源的值。
    • 获取名为 “SettingsData” 的共享偏好设置实例。
  4. 按钮初始化和点击事件:

    • 初始化了七个按钮对象,并分别为它们设置了点击监听器。
    • 当用户点击按钮时,相应的 onClick 方法将被调用。
  5. onClick 方法:

    • 在用户点击按钮时触发的方法,这个方法实现了对不同按钮的响应操作。
    • 首先,获取共享偏好设置实例和编辑器。
    • 根据用户点击的按钮或者已经保存的延迟时间,修改偏好设置中的 “water_delay” 值。
    • 根据点击的按钮,修改按钮的文本颜色以进行视觉提示。
    • 如果用户点击了 “startBtn”,设置一个重复性闹钟,以提醒用户喝水。
    • 如果用户点击了 “stopBtn”,取消之前设置的闹钟,并显示一个提示信息。

这段代码实现了一个界面,用户可以点击不同的按钮来设置提醒的时间间隔,以及开始和停止喝水提醒的功能。

三.项目源码

链接:https://pan.baidu.com/s/1Ydtv31fBAuenfCQJeJCeOw?pwd=0616
提取码:0616

创作不易,项目已加密,有偿(仅一杯奶茶钱,可做实验报告,代码讲解等…)

请私信作者或

(v)15135757306

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/100317.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

题目有点太简单了,不知道怎么选了

有个公司给了下面一个题目&#xff0c;看了下太简单了&#xff0c;都怕选错了。 后来拿着程序跑了下&#xff0c;就是这个意思嘛。 结论 程序跑出来的结果就是对输入的列表进行倒序排列。 public void testGetPut() throws Exception {List<Integer> numbers List.of(…

安防监控/磁盘阵列存储/视频汇聚平台EasyCVR调用rtsp地址返回的IP不正确是什么原因?

安防监控/云存储/磁盘阵列存储/视频汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等&#xff0c;能对外分发RTSP、RT…

【SQL应知应会】索引 • Oracle版:B-树索引;位图索引;函数索引;单列与复合索引;分区索引

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 本文免费学习&#xff0c;自发文起3天后&#xff0c;会收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习&#xff0c;有基础也有进阶&#xff0c;有MySQL也有Oracle …

Vue+Element-ui实现表格本地导入

表格文件存储在前端 如图&#xff0c;表格文件template.xlsx存储在public下的static文件夹下 注意这里的路径容易报错 a链接下载文件失败的问题(未发现文件&#xff09; a.href ‘./static/template.xlsx’ 写的时候不能带public&#xff0c;直接这么写就可以 DownloadTemp…

Linux进程概念及其状态

文章目录 &#x1f347;1. 什么是进程&#x1f348;1.1 概念&#x1f348;1.2 理解进程 &#x1f34b;2. Linux的PCB&#x1f34e;3. 查看进程 & 杀死进程&#x1f352;4. 系统调用获取进程标识符&#x1f353;4.1 进程PID&#x1f353;4.2 父进程PPID &#x1f346;5. 系统…

uniapp 微信小程序添加隐私保护指引

隐私弹窗&#xff1a; <uni-popup ref"popup"><view class"popupWrap"><view class"popupTxt">在你使用【最美万年历】之前&#xff0c;请仔细阅读<text class"blueColor" click"handleOpenPrivacyContract…

Linux学习之lvm删除

umount /mnt/logicvolumntest卸载挂载。 lvremove /dev/vgname/my_lv可以删除逻辑卷&#xff0c;其中vgname是指定逻辑卷所在的卷组名称&#xff0c;my_lv是逻辑卷的名称。 注意&#xff1a;使用lvremove命令会永久删除逻辑卷和其中的数据&#xff0c;因此请在使用之前进行适当…

解决springboot项目中的groupId、package或路径的混淆问题

对于像我一样喜欢跳跃着学习的聪明人来说&#xff0c;肯定要学springboot&#xff0c;什么sevlet、maven、java基础&#xff0c;都太老土了&#xff0c;用不到就不学。所以古代的聪明人有句话叫“书到用时方恨少”&#xff0c;测试开源项目时&#xff0c;编译总是报错&#xff…

【FreeRTOS】互斥量的使用与逐步实现

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

RNN 单元:分析 GRU 方程与 LSTM,以及何时选择 RNN 而不是变压器

一、说明 深度学习往往感觉像是在雪山上找到自己的道路。拥有坚实的原则会让你对做出决定更有信心。我们都去过那里 在上一篇文章中&#xff0c;我们彻底介绍并检查了 LSTM 单元的各个方面。有人可能会争辩说&#xff0c;RNN方法已经过时了&#xff0c;研究它们是没有意义的。的…

Python Opencv实践 - 轮廓检测

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/map.jpg") print(img.shape) plt.imshow(img[:,:,::-1])#Canny边缘检测 edges cv.Canny(img, 127, 255, 0) plt.imshow(edges, cmapplt.cm.gray)#查找轮廓 #c…

pdf怎么删除其中一页?

pdf怎么删除其中一页&#xff1f;现在&#xff0c;pdf文件已经深入影响着我们的工作和学习&#xff0c;如果你是一个上班族&#xff0c;那么几乎每天都会使用到pdf格式的电脑文件。当我们阅读一个页数众多的PDF文件时&#xff0c;可能会发现实际上只需要其中的一小部分内容。很…

jvm-堆

1.堆的核心概念 一个jvm实例只存在一个堆内存&#xff0c;堆也是java内存管理核心区域 java堆区在jvm启动的时候即被创建&#xff0c;其空间大小就确定了&#xff0c;是jvm管理最大的一块内存空间&#xff1b; 堆可以处于物理上不连续的内存空间&#xff0c;但在逻辑上它应该被…

Sqoop实操案例-互联网招聘数据迁移

&#x1f947;&#x1f947;【大数据学习记录篇】-持续更新中~&#x1f947;&#x1f947; 个人主页&#xff1a;beixi 本文章收录于专栏&#xff08;点击传送&#xff09;&#xff1a;【大数据学习】 &#x1f493;&#x1f493;持续更新中&#xff0c;感谢各位前辈朋友们支持…

在 macOS 中安装 TensorFlow 1g

tensorflow 需要多大空间 pip install tensorflow pip install tensorflow Looking in indexes: https://pypi.douban.com/simple/ Collecting tensorflowDownloading https://pypi.doubanio.com/packages/1a/c1/9c14df0625836af8ba6628585c6d3c3bf8f1e1101cafa2435eb28a7764…

面试被打脸,数据结构底层都不知道么--回去等通知吧

数据结构之常见的8种数据结构&#xff1a; -数组Array -链表 Linked List -堆 heap -栈 stack -队列 Queue -树 Tree -散列表 Hash -图 Graph 数据结构-链表篇 Linklist定义&#xff1a; -是一种线性表&#xff0c;并不会按线性的顺序存储数据&#xff0c;即逻辑上相邻…

Spring Boot源码解读与原理剖析:深入探索Java开发的奥秘!

评论区留言赠书15本 关注点赞评论&#xff0c;评论区回复“Spring Boot源码解读与原理剖析&#xff1a;深入探索Java开发的奥秘&#xff01;” 每篇最多评论3条&#xff01;&#xff01;采用抽奖助手自动拉取评论区有效评论送书两本&#xff0c; 开奖时间&#xff1a;9月11号 承…

Git的基本使用笔记——狂神说

版本控制 版本迭代&#xff0c; 版本控制( Revision control)是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史&#xff0c;方便查看更改历史记录&#xff0c;备份以便恢复以前的版本的软件工程技术。 实现跨区域多人协同开发 追踪和记载一个或者多个文件的…

封装(个人学习笔记黑马学习)

1、格式 #include <iostream> using namespace std;const double PI 3.14;//设计一个圆类&#xff0c;求圆的周长 class Circle {//访问权限//公共权限 public://属性//半径int m_r;//行为//获取圆的周长double calculateZC() {return 2 * PI * m_r;} };int main() {//通…

科技驱动产业升级:浅谈制造型企业对MES系统的应用

在科技不断进步的背景下&#xff0c;制造型行业也在持续发展&#xff0c;但随之而来的挑战也不断增加。传统的管理方式已经无法满足企业的需求&#xff0c;因此许多制造型企业开始寻找新的管理模式。制造执行系统&#xff08;MES&#xff09;作为先进的制造信息技术之一&#x…