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

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

  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

相关推荐
天空中的野鸟1 小时前
Android音频采集
android·音视频
小白也想学C2 小时前
Android 功耗分析(底层篇)
android·功耗
曙曙学编程2 小时前
初级数据结构——树
android·java·数据结构
闲暇部落4 小时前
‌Kotlin中的?.和!!主要区别
android·开发语言·kotlin
诸神黄昏EX6 小时前
Android 分区相关介绍
android
大白要努力!7 小时前
android 使用SQLiteOpenHelper 如何优化数据库的性能
android·数据库·oracle
Estar.Lee7 小时前
时间操作[取当前北京时间]免费API接口教程
android·网络·后端·网络协议·tcp/ip
Winston Wood7 小时前
Perfetto学习大全
android·性能优化·perfetto
Dnelic-10 小时前
【单元测试】【Android】JUnit 4 和 JUnit 5 的差异记录
android·junit·单元测试·android studio·自学笔记
Eastsea.Chen13 小时前
MTK Android12 user版本MtkLogger
android·framework