Android安卓实战项目(11)—每个步骤带有动画演示功能的线上运动APP,可计算每日运动卡路里(源码在文末)

news2024/9/21 12:50:05

Android安卓实战项目(11)—每个步骤带有动画演示功能的线上运动APP,可计算每日运动卡路里(源码在文末🐕🐕🐕)

【bilibili演示】
https://www.bilibili.com/video/BV1bk4y1g7Wo/?share_source=copy_web&vd_source=b2e9b9ed746acda34f499009647748ed

一.项目运行介绍

主页面

image-20230807194151709

每日卡路里记录

image-20230807194219749

进行运动—1

image-20230807194259260

image-20230807194315749

image-20230807194336722

image-20230807194352947

image-20230807194408035

image-20230807194418759

image-20230807194429903

运动(1)后卡路里记录展示

image-20230807194500970

右上角提示窗口

image-20230807194612388

二.具体实现

MainActivity.java
package com.team.sportsskuyy;

import android.content.Intent;

import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.cardview.widget.CardView;

import com.getkeepsafe.taptargetview.TapTargetView;
import com.getkeepsafe.taptargetview.TapTarget;
import com.google.android.material.snackbar.Snackbar;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import java.util.Map;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private CardView kalori,easy,medium,expert;
    private DatabaseReference mDatabase;
    String all;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //Definisi Text And Image
        final ImageView imageView = findViewById(R.id.dokumentasi);
        final ImageView hapus = findViewById(R.id.delkalori);
        final TextView mTotal = findViewById(R.id.mTotal);
        //Definisi Kartu Pada Layout
        kalori = (CardView) findViewById(R.id.kalori);
        easy = (CardView) findViewById(R.id.mudah);
        medium = (CardView) findViewById(R.id.sedang);
        expert = (CardView) findViewById(R.id.sulit);
        //Click Listener Pada Kartu
        kalori.setOnClickListener(this);
        easy.setOnClickListener(this);
        medium.setOnClickListener(this);
        expert.setOnClickListener(this);
        imageView.setOnClickListener(this);
        //Definisi Firebase
        mDatabase = FirebaseDatabase.getInstance().getReference().child("latihan");

        hapus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mDatabase.setValue(null);
                mTotal.setText("0");
                Snackbar.make(findViewById(R.id.delkalori),"Berhasil menghapus semua kalori",Snackbar.LENGTH_LONG).show();
            }
        });

        //Sum Kalori
        mDatabase.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                int sum = 0;
                for(DataSnapshot ds : dataSnapshot.getChildren()){
                    Map<String,Object> map = (Map<String,Object>) ds.getValue();
                    assert map != null;
                    Object kal = map.get("kalori");
                    int pValue = Integer.parseInt(String.valueOf(kal));
                    sum += pValue;
                    mTotal.setText(String.valueOf(sum));
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

        // Tap Target
        TapTargetView.showFor(this,                 // `this` is an Activity
                TapTarget.forView(findViewById(R.id.dokumentasi), "Baca Tutorialnya\nDisini")
                        // All options below are optional
                        .outerCircleColor(R.color.emerald)      // Specify a color for the outer circle
                        .outerCircleAlpha(0.96f)            // Specify the alpha amount for the outer circle
                        .targetCircleColor(R.color.white)   // Specify a color for the target circle
                        .titleTextSize(22)                  // Specify the size (in sp) of the title text
                        .textColor(R.color.white)    // Specify a color for both the title and description text
                        .dimColor(R.color.midnightblue)     // If set, will dim behind the view with 30% opacity of the given color
                        .drawShadow(true)                   // Whether to draw a drop shadow or not
                        .cancelable(false)                  // Whether tapping outside the outer circle dismisses the view
                        .tintTarget(true)                   // Whether to tint the target view's color
                        .transparentTarget(false)           // Specify whether the target is transparent (displays the content underneath)
                        .targetRadius(60),                  // Specify the target radius (in dp)
                new TapTargetView.Listener() {              // The listener can listen for regular clicks, long clicks or cancels
                    @Override
                    public void onTargetClick(TapTargetView view) {
                        super.onTargetClick(view);      // This call is optional
                    }
                });
    }

    @Override
    public void onClick(View v) {
        Intent i;
        switch (v.getId()){
            case R.id.kalori : i = new Intent(this,Kalori.class);startActivity(i); break;
            case R.id.mudah : i = new Intent(this, EasyStepper.class);startActivity(i); break;
            case R.id.sedang : i = new Intent(this, MediumStepper.class);startActivity(i); break;
            case R.id.sulit : i = new Intent(this, ExpertStepper.class);startActivity(i); break;
            case R.id.dokumentasi : i = new Intent(this, Dokumentasi.class);startActivity(i); break;
            default:break;
        }

    }
}

这段代码是一个Android应用程序的主活动(MainActivity),它实现了一个简单的健身应用界面。下面逐行解释代码的各个部分:

package com.team.sportsskuyy;

这一行是指定Java文件的包名。

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.cardview.widget.CardView;
import com.getkeepsafe.taptargetview.TapTargetView;
import com.getkeepsafe.taptargetview.TapTarget;
import com.google.android.material.snackbar.Snackbar;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import java.util.Map;

这些是引入所需的Android类和库。

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

这个类是MainActivity,它扩展自AppCompatActivity,并且实现了View.OnClickListener接口,以便处理视图的点击事件。

private CardView kalori, easy, medium, expert;
private DatabaseReference mDatabase;
String all;

这里声明了一些成员变量,包括用于卡片视图(CardView)的引用,Firebase数据库的引用,以及一个字符串变量。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

这是活动的创建方法。它设置了活动的布局,该布局在"res/layout"目录下的"activity_main.xml"文件中定义。

final ImageView imageView = findViewById(R.id.dokumentasi);
final ImageView hapus = findViewById(R.id.delkalori);
final TextView mTotal = findViewById(R.id.mTotal);

这里初始化了几个ImageView和一个TextView,通过它们可以找到布局中对应的视图。

kalori = (CardView) findViewById(R.id.kalori);
easy = (CardView) findViewById(R.id.mudah);
medium = (CardView) findViewById(R.id.sedang);
expert = (CardView) findViewById(R.id.sulit);

这些代码初始化了卡片视图(CardView)的引用,它们分别与布局中的id为"kalori"、“mudah”、"sedang"和"sulit"的卡片视图相关联。

kalori.setOnClickListener(this);
easy.setOnClickListener(this);
medium.setOnClickListener(this);
expert.setOnClickListener(this);
imageView.setOnClickListener(this);

为卡片视图和ImageView设置点击监听器,当它们被点击时,会触发onClick方法。

mDatabase = FirebaseDatabase.getInstance().getReference().child("latihan");

这里初始化了Firebase数据库的引用,它指向一个名为"latihan"的数据集。

hapus.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        mDatabase.setValue(null);
        mTotal.setText("0");
        Snackbar.make(findViewById(R.id.delkalori), "Berhasil menghapus semua kalori", Snackbar.LENGTH_LONG).show();
    }
});

这是一个点击监听器,当"hapus"视图被点击时,它会在Firebase数据库中设置为null,然后将文本视图"mTotal"的文本设置为"0",最后显示一个Snackbar提示。

mDatabase.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        int sum = 0;
        for(DataSnapshot ds : dataSnapshot.getChildren()){
            Map<String, Object> map = (Map<String, Object>) ds.getValue();
            assert map != null;
            Object kal = map.get("kalori");
            int pValue = Integer.parseInt(String.valueOf(kal));
            sum += pValue;
            mTotal.setText(String.valueOf(sum));
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {

    }
});

这是Firebase数据库的值事件监听器,当数据发生变化时,它会遍历数据快照(DataSnapshot)中的子项,并将其中的"kalori"值累加到"sum"变量中,然后将"sum"值显示在"mTotal"文本视图中。

TapTargetView.showFor(this, TapTarget.forView(findViewById(R.id.dokumentasi), "Baca Tutorialnya\nDisini")
    // ...(一些设置略去)

这是用于显示TapTargetView的代码,它用于展示一个用户引导提示。它会在"imageView"视图上显示一个圆形引导,带有一些自定义的视觉设置。

@Override
public void onClick(View v) {
    Intent i;
    switch (v.getId()){
        case R.id.kalori : i = new Intent(this, Kalori.class); startActivity(i); break;
        case R.id.mudah : i = new Intent(this, EasyStepper.class); startActivity(i); break;
        case R.id.sedang : i = new Intent(this, MediumStepper.class); startActivity(i); break;
        case R.id.sulit : i = new Intent(this, ExpertStepper.class); startActivity(i); break;
        case R.id.dokumentasi : i = new Intent(this, Dokumentasi.class); startActivity(i); break;
        default:break;
    }
}

这是点击监听器的实现方法。根据被点击的视图ID,它会启动不同的活动(Activity),这些活动分别是"Kalori"、“EasyStepper”、“MediumStepper”、“ExpertStepper"和"Dokumentasi”。根据所点击的不同视图,会有不同的操作。

MediumStepper.java
package com.team.sportsskuyy;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.CountDownTimer;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import io.victoralbertos.breadcumbs_view.BreadcrumbsView;
import pl.droidsonroids.gif.GifImageView;

public class MediumStepper extends AppCompatActivity {

    DatabaseReference databaseLatihan;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_medium_stepper);
        //Definisi firebase
        databaseLatihan = FirebaseDatabase.getInstance().getReference("latihan");
        // Definisi Gif
        final GifImageView anim = (GifImageView) findViewById(R.id.gif);
        // Definisi Breadcrumbs
        final BreadcrumbsView lanjot = (BreadcrumbsView) findViewById(R.id.breadcrumbs);
        // Definisi TextView
        final TextView keterangan = (TextView) findViewById(R.id.tulisan);
        // Definisi Button
        final Button button = (Button) findViewById(R.id.Lanjutes);
        final Button nyerah = (Button) findViewById(R.id.nyerahex);
        // Mengubah title
        this.setTitle("Latihan Sedang");
        // Hidden button first time
        nyerah.setVisibility(View.INVISIBLE);

        nyerah.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showDialog();
            }
        });

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Timer
                new CountDownTimer(3000,1000){
                    @Override
                    public void onFinish() {
                        button.setVisibility(View.VISIBLE);
                    }

                    @Override
                    public void onTick(long millisUntilFinished) {
                        button.setVisibility(View.INVISIBLE);
                    }
                }.start();
                // Change Kabeh
                if (button.getText() == "SELESAI"){
                    button.setText("Keluar");
                    keterangan.setText("Latihan Telah Selesai");
                    anim.setImageResource(R.drawable.ic_trophy);
                    nyerah.setVisibility(View.INVISIBLE);
                    lanjot.nextStep();
                }else if(button.getText() == "Keluar"){
                    MediumStepper.this.finish();
                }else if(button.getText() == "Lanjut Langkah Ke 2"){
                    button.setText("Lanjut Langkah Ke 3");
                    anim.setImageResource(R.drawable.highkneeup);
                    keterangan.setText("Lakukan High Knee Up\nselama 45 detik");
                    lanjot.nextStep();
                    addLatihan("High Knee Up",45);
                }else if(button.getText() == "Lanjut Langkah Ke 3"){
                    button.setText("Lanjut Langkah Ke 4");
                    anim.setImageResource(R.drawable.mountainclimber);
                    keterangan.setText("Lakukan Mountain Climbers\nselama 45 detik");
                    lanjot.nextStep();
                    addLatihan("Mountain Climbers",45);
                }else if(button.getText() == "Lanjut Langkah Ke 4"){
                    button.setText("Istirahat Pertama");
                    anim.setImageResource(R.drawable.situp);
                    keterangan.setText("Lakukan Sit Up\nselama 45 detik");
                    lanjot.nextStep();
                    addLatihan("Sit Up",30);
                }else if(button.getText() == "Istirahat Pertama"){
                    button.setText("Lanjut Langkah Ke 6");
                    anim.setImageResource(R.drawable.ic_break);
                    keterangan.setText("Istirahat dahulu\nselama 20 detik");
                    lanjot.nextStep();
                }else if(button.getText() == "Lanjut Langkah Ke 6"){
                    button.setText("Lanjut Langkah Ke 7");
                    anim.setImageResource(R.drawable.plankknee);
                    keterangan.setText("Lakukan Plank Knee Twist\nselama 45 detik");
                    lanjot.nextStep();
                    addLatihan("Plank Knee Twist",40);
                }else if(button.getText() == "Lanjut Langkah Ke 7"){
                    button.setText("Lanjut Langkah Ke 8");
                    anim.setImageResource(R.drawable.widepushup);
                    keterangan.setText("Lakukan Wide Push Up\nselama 45 detik");
                    lanjot.nextStep();
                    addLatihan("Wide Push Up",30);
                }else if(button.getText() == "Lanjut Langkah Ke 8"){
                    button.setText("Lanjut Langkah Ke 9");
                    anim.setImageResource(R.drawable.crunch);
                    keterangan.setText("Lakukan Crunch\nselama 45 detik");
                    lanjot.nextStep();
                    addLatihan("Crunch",25);
                }else if(button.getText() == "Lanjut Langkah Ke 9"){
                    button.setText("Istirahat Kedua");
                    anim.setImageResource(R.drawable.pushup);
                    keterangan.setText("Lakukan Push Up\nselama 45 detik");
                    lanjot.nextStep();
                    addLatihan("Push Up",25);
                }else if(button.getText() == "Istirahat Kedua"){
                    button.setText("Lanjut Langkah Ke 10");
                    anim.setImageResource(R.drawable.ic_break);
                    keterangan.setText("Istirahat dahulu\nselama 20 detik");
                    lanjot.nextStep();
                }else if(button.getText() == "Lanjut Langkah Ke 10"){
                    button.setText("Lanjut Langkah Ke 11");
                    anim.setImageResource(R.drawable.russiantwist);
                    keterangan.setText("Lakukan Russian Twist\nselama 45 detik");
                    lanjot.nextStep();
                    addLatihan("Russin Twist",25);
                }else if(button.getText() == "Lanjut Langkah Ke 11"){
                    button.setText("Lanjut Langkah Ke 12");
                    anim.setImageResource(R.drawable.burpeess);
                    keterangan.setText("Lakukan Burpees\nselama 45 detik");
                    lanjot.nextStep();
                    addLatihan("Burpess",60);
                }else if(button.getText() == "Lanjut Langkah Ke 12"){
                    button.setText("Lanjut Langkah Ke 13");
                    anim.setImageResource(R.drawable.toejump);
                    keterangan.setText("Lakukan Toe Jump\nselama 45 detik");
                    lanjot.nextStep();
                    addLatihan("Toe Jump",30);
                }else if(button.getText() == "Lanjut Langkah Ke 13"){
                    button.setText("Lanjut Langkah Ke 14");
                    anim.setImageResource(R.drawable.plank);
                    keterangan.setText("Lakukan Plank\nselama 45 detik");
                    lanjot.nextStep();
                    addLatihan("Plank",55);
                }else if(button.getText() == "Lanjut Langkah Ke 14"){
                    button.setText("Istirahat Ketiga");
                    anim.setImageResource(R.drawable.squat);
                    keterangan.setText("Lakukan Squat\nselama 45 detik");
                    lanjot.nextStep();
                    addLatihan("Squat",35);
                }else if(button.getText() == "Istirahat Ketiga"){
                    button.setText("Lanjut Langkah Ke 15");
                    anim.setImageResource(R.drawable.ic_break);
                    keterangan.setText("Istirahat dahulu\nselama 20 detik");
                    lanjot.nextStep();
                }else if(button.getText() == "Lanjut Langkah Ke 15"){
                    button.setText("Lanjut Langkah Ke 16");
                    anim.setImageResource(R.drawable.situp);
                    keterangan.setText("Lakukan Sit Up\nselama 45 detik");
                    lanjot.nextStep();
                    addLatihan("Sit Up",30);
                }else if(button.getText() == "Lanjut Langkah Ke 16"){
                    button.setText("Lanjut Langkah Ke 17");
                    anim.setImageResource(R.drawable.pushup);
                    keterangan.setText("Lakukan Push Up\nselama 45 detik");
                    lanjot.nextStep();
                    addLatihan("Push Up",30);
                }else if(button.getText() == "Lanjut Langkah Ke 17"){
                    button.setText("SELESAI");
                    anim.setImageResource(R.drawable.jumpingjacks);
                    keterangan.setText("Lakukan Jumping Jack\nselama 45 detik");
                    lanjot.nextStep();
                    addLatihan("Jumping Jacks",50);
                } else {
                    button.setText("Lanjut Langkah Ke 2");
                    nyerah.setVisibility(View.VISIBLE);
                    anim.setImageResource(R.drawable.jumpingjacks);
                    keterangan.setText("Lakukan Jumping Jacks\nselama 45 detik");
                    addLatihan("Jumping Jacks", 45);
                    lanjot.nextStep();
                }
            }
        });
    }

    public void addLatihan(String gerakan, int kalori) {
        DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss dd/MM/yyyy");
        Date date = new Date();

        String id_latihan = databaseLatihan.push().getKey();
        String tanggal = dateFormat.format(date);
        int jumlah_kalori = 605;

        addFirebase save = new addFirebase(id_latihan, tanggal, gerakan, kalori);
        databaseLatihan.child(id_latihan).setValue(save);
    }

    public void onBackPressed(){
        showDialog();
    }

    private void showDialog(){
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
                this);

        // set title dialog
        alertDialogBuilder.setTitle("Informasi");

        // set pesan dari dialog
        alertDialogBuilder
                .setMessage("Apakah Anda yakin mau berhenti?\nudah latihan loh!")
                .setIcon(R.mipmap.icons)
                .setCancelable(false)
                .setPositiveButton("Ya",new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog,int id) {
                        // jika tombol diklik, maka akan menutup activity ini
                        MediumStepper.this.finish();
                    }
                })
                .setNegativeButton("Tidak",new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        // jika tombol ini diklik, akan menutup dialog
                        // dan tidak terjadi apa2
                        dialog.cancel();
                    }
                });

        // membuat alert dialog dari builder
        AlertDialog alertDialog = alertDialogBuilder.create();

        // menampilkan alert dialog
        alertDialog.show();
    }

}

这段代码是一个 Android 应用程序,用于实现一个健身计划的应用。下面逐行解释代码的主要部分:

package com.team.sportsskuyy;

这行代码声明了 Java 包的名称,它是这个应用程序的命名空间。

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.CountDownTimer;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

这些是导入所需的 Android 类。AlertDialog 用于显示对话框,CountDownTimer 用于实现倒计时,Bundle 是用于存储活动状态信息的容器,View 用于视图操作,Button 是按钮控件,TextView 是文本显示控件。

import androidx.appcompat.app.AppCompatActivity;

这里导入了 AppCompatActivity 类,用于创建一个 Android 活动。

import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;

这两行导入了与 Firebase 数据库相关的类,用于与实时数据库进行交互。

import io.victoralbertos.breadcumbs_view.BreadcrumbsView;
import pl.droidsonroids.gif.GifImageView;

这里导入了两个自定义库的类,分别是用于显示面包屑导航的 BreadcrumbsView 和用于显示 GIF 图像的 GifImageView

public class MediumStepper extends AppCompatActivity {

这是一个名为 MediumStepper 的类,继承自 AppCompatActivity,表示一个 Android 活动。

DatabaseReference databaseLatihan;

声明了一个 DatabaseReference 类型的变量 databaseLatihan,用于与 Firebase 数据库建立连接。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_medium_stepper);

onCreate 方法是 Android 活动的生命周期方法之一,用于在活动创建时执行。这里通过 setContentView 设置活动的布局,即 activity_medium_stepper.xml

databaseLatihan = FirebaseDatabase.getInstance().getReference("latihan");

这行代码初始化了 databaseLatihan 变量,指向 Firebase 数据库中的 “latihan” 节点。

final GifImageView anim = (GifImageView) findViewById(R.id.gif);

声明了一个 GifImageView 类型的变量 anim,表示用于显示 GIF 图像的视图控件,通过 findViewById 方法找到布局文件中 R.id.gif 对应的视图。

final BreadcrumbsView lanjot = (BreadcrumbsView) findViewById(R.id.breadcrumbs);

声明了一个 BreadcrumbsView 类型的变量 lanjot,表示用于显示面包屑导航的视图控件,通过 findViewById 方法找到布局文件中 R.id.breadcrumbs 对应的视图。

final TextView keterangan = (TextView) findViewById(R.id.tulisan);

声明了一个 TextView 类型的变量 keterangan,表示用于显示文本的视图控件,通过 findViewById 方法找到布局文件中 R.id.tulisan 对应的视图。

final Button button = (Button) findViewById(R.id.Lanjutes);
final Button nyerah = (Button) findViewById(R.id.nyerahex);

声明了两个 Button 类型的变量 buttonnyerah,分别表示两个按钮控件,通过 findViewById 方法找到布局文件中对应的视图。

this.setTitle("Latihan Sedang");

设置活动的标题为 “Latihan Sedang”。

nyerah.setVisibility(View.INVISIBLE);

nyerah 按钮的可见性设置为不可见。

nyerah.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        showDialog();
    }
});

nyerah 按钮设置点击事件监听器,当按钮被点击时,调用 showDialog() 方法显示对话框。

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // ...
        // 这里是按钮点击事件的处理逻辑,根据按钮的文本不同执行不同的操作
        // ...
    }
});

button 按钮设置点击事件监听器,当按钮被点击时,执行按钮点击事件的处理逻辑。

public void addLatihan(String gerakan, int kalori) {
    // ...
    // 这是一个自定义方法,用于将健身信息添加到 Firebase 数据库中
    // ...
}

addLatihan 方法用于将健身信息添加到 Firebase 数据库中,包括运动名称和消耗的卡路里数。

public void onBackPressed(){
    showDialog();
}

重写了 onBackPressed 方法,当用户按下返回按钮时,调用 showDialog() 方法显示对话框。

private void showDialog(){
    // ...
    // 这是一个自定义方法,用于显示一个确认对话框
    // ...
}

showDialog 方法用于显示一个确认对话框,询问用户是否确定要退出。

总体来说,这段代码实现了一个健身计划应用,用户可以在不同的健身步骤之间切换,计时每个动作,将健身信息存储到 Firebase 数据库,并提供了退出确认的对话框。

三.项目源码

项目已开源:

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

创作不易(可做实验报告,代码讲解等)

请私信作者或

(v)15135757306

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue day01

Vue 1.简介&#xff1a; ​ Vue是一套用于构建用户界面的渐进式框架。与其他大型框架不同的是&#xff0c;Vue被设计为可以自底向上逐层应用。Vue的核心库只关注视图层&#xff0c;不仅容易上手&#xff0c;还便于与第三方库或既有项目整合。另一方面&#xff0c;当与现代化的工…

taro Swiper组件--异形滚动

效果 <SwiperindicatorDots{false}previousMargin50pxnextMargin50pxautoplay{false}interval100onChange{onChangeSwiper} >{[1,2,3].map((item, index) > {return (<SwiperItemkey{item-${index}}><View className{demo-item ${currentIndex index ? ac…

【PCL-6】PCL基于凹凸型的分割算法(LCCP)

凹凸型分割算法适用于颜色类似、棱角分明的物体场景分割。LCCP方法不依赖点云颜色&#xff0c;只使用空间信息和法线信息。 算法流程&#xff1a; 1、基于超体聚类的过分割&#xff1b; 2、在超体聚类的基础上再聚类。 算法思路&#xff1a; 1、基于CC和SC判断凹凸性&…

24.Netty源码之合理管理堆内存

highlight: arduino-light 合理管理 Netty 堆外内存 内存使用目标 •内存占用少(空间) •应用速度快(时间) 即多快好省 对 Java 而言&#xff1a;减少 Full GC 的 STW(Stop the world)时间 内存使用技巧 • 减少对象本身大小 md 例 1&#xff1a;用基本类型就不要用包装类。 例…

程序使用Microsoft.XMLHTTP对象请求https时出错解决

程序中使用Microsoft.XMLHTTP组件请求https时出现如下错误&#xff1a; 出错程序代码示例&#xff1a; strUrl "https://www.xxx.com/xxx.asp?id11" dim objXmlHttp set objXmlHttp Server.CreateObject("Microsoft.XMLHTTP") objXmlHttp.open "…

关于架构与架构师的一些感悟

本博客地址&#xff1a;https://security.blog.csdn.net/article/details/132152177 一、引子 最近在做工作总结的过程中&#xff0c;对于架构与架构师又有了一些新的感悟&#xff0c;本文有感而写&#xff0c;分为四个部分&#xff1a; ● 关于系统架构 ● 关于系统架构师 …

动手学深度学习(三)线性神经网络—softmax回归

分类任务是对离散变量预测&#xff0c;通过比较分类的概率来判断预测的结果。 softmax回归和线性回归一样也是将输入特征与权重做线性叠加&#xff0c;但是softmax回归的输出值个数等于标签中的类别数&#xff0c;这样就可以用于预测分类问题。 分类问题和线性回归的区别&#…

《24海南大学835软件工程考研经验贴》

1.经验之谈 首先&#xff0c;我是一个二战的考生&#xff0c;一战给我带来的经验有几点。第一&#xff0c;数学、专业课这两门越早复习越好&#xff0c;越拖到后面你就会发现来不及了&#xff0c;这学不完&#xff0c;那学不完的。第二、我认为是比较关键的一点&#xff0c;一定…

WebRTC基础知识

文章目录 基础概念NAT (Network Address Translation) 打洞STUN&#xff08;Session Traversal Utilities for NAT&#xff09;基于STUN协议的DDoS反射攻击 # TODO TURN&#xff08;Traversal Using Relays around NAT&#xff09;ICE&#xff08;Interactive Connectivity Est…

Java版企业电子招标采购系统源码Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis tbms

​ 功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查…

[C#] 简单的俄罗斯方块实现

一个控制台俄罗斯方块游戏的简单实现. 已在 github.com/SlimeNull/Tetris 开源. 思路 很简单, 一个二维数组存储当前游戏的方块地图, 用 bool 即可, true 表示当前块被填充, false 表示没有. 然后, 抽一个 “形状” 类, 形状表示当前玩家正在操作的一个形状, 例如方块, 直线…

力扣 474. 一和零

题目来源&#xff1a;https://leetcode.cn/problems/ones-and-zeroes/description/ C题解&#xff1a;本题其实是01背包问题&#xff01;只不过这个背包有两个维度&#xff0c;一个是m 一个是n&#xff0c;而不同长度的字符串就是不同大小的待装物品。动规五部曲&#xff1a; …

Java并发 | 常见线程安全容器

文章目录 简介一、Hash表&#x1f6a3;1、ConcurrentHashMap1.1 内部实现原理1.2 并发操作方法1.3 ConcurrentHashMap与Hashtable的比较 二、集合&#x1f6a3;2、CopyOnWriteArrayList2.1 内部实现原理2.2 Copy-On-Write(COW)设计思想2.3 实操 三、Map&#x1f6a3;3、Concurr…

C语言第十课----------------扫雷----------数组的经典练手题

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; &#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382;…

力扣120.三角形最小路径和(动态规划)

/*** author Limg* date 2022/08/09* 给定一个三角形 triangle &#xff0c;找出自顶向下的最小路径和。* 每一步只能移动到下一行中相邻的结点上。* 相邻的结点在这里指的是下标与上一层结点下标相同或者等于上一层结点下标 1 的两个结点。* 也就是说&#xff0c;如果正位于当…

(MVC)SpringBoot+Mybatis+Mapper.xml

前言&#xff1a;本篇博客主要对MVC架构、Mybatis工程加深下理解&#xff0c;前面写过一篇博客&#xff1a;SprintBoothtml/css/jsmybatis的demo&#xff0c;里面涉及到了Mybatis的应用&#xff0c;此篇博客主要介绍一种将sql语句写到了配置文件里的方法&#xff0c;即Mybatis里…

AVL树(二叉搜索树)

AVL树 1.1 AVL树的概念1.2 AVL树节点的定义1.3 AVL树的旋转1.3.1 右旋&#xff08;右单旋&#xff09;1.3.2 左旋&#xff08;左单旋&#xff09;1.3.3 左右双旋&#xff08;先左单旋再右单旋&#xff09;1.3.4 右左双旋&#xff08;先右单旋再左单旋&#xff09; 1.4 AVL树的插…

进程 的初识

程序和进程有什么区别 程序是静态的概念&#xff0c;gcc xxx.c -o pro 磁盘中生成的文件&#xff0c;叫做程序。进程是程序的一次运行活动&#xff0c;通俗点的意思就是程序跑起来了&#xff0c;系统中就多了一个进程。 如何查看系统中有哪些进程 使用 ps 指令&#xff08;完整…

❤ vue组件的生命周期

❤ vue组件的生命周期 介绍 在vue组件中&#xff0c;生命周期指的是从组件创建开始&#xff0c;到组件销毁&#xff0c;所经历的整个过程&#xff1b;在这个过程中的一些不同的阶段&#xff0c;vue会调用指定的一些组件方法。基本生命周期函数有下面几个阶段&#xff1a;创建…

Python中的dataclass:简化数据类的创建

Python中的dataclass是一个装饰器&#xff0c;用于自动添加一些常见的方法&#xff0c;如构造函数、__repr__、__eq__等。它简化了创建数据类的过程&#xff0c;减少了样板代码&#xff0c;提高了代码的可读性和可维护性。有点类似java里面的Java Bean。 让我们看一个简单的例子…