> 文档中心 > 《物联篮球计分器》Android应用程序开发-期末课程设计

《物联篮球计分器》Android应用程序开发-期末课程设计

  • 目录

    开发寄语

    开发功能

    开发环境

    程序流程图

    实现步骤

    将活动所需要的图片文件(.jpg或.png)统一保存在drawable文件夹

    主活动的布局文件activity_fore.xml

    主活动的java文件ForeActivity.java

    第二个活动的布局文件activity_main.xml

    第二个活动的菜单文件main.xml

    第二个活动的java文件MainActivity.java

    关于res/drawable的图片资源下载地址说明

    如何将项目app传到手机

    (1)生成APK安装包

     (2)打开APK安装包保存地址

    (3)将安装包放入自命名的文件夹里,拉到手机,在手机文件资源处进行查看并安装

    APP效果图


  • 开发寄语

       本人出于情怀,恰巧与课程设计撞了个满怀,兴趣上头,开发了一款简单实用、便捷舒服的多功能篮球计分APP,以此来纪念我大学三年的篮球生涯以及队友。希望多年来我们还可以凑在一起,打打篮球、谈谈人生,或者带着我们的孩子,一起在篮球场上组个队。在此,我致敬所有热爱篮球并追逐梦想的人。

  • 开发功能

       实现一款简单、便捷、实用的多功能篮球计分器,其中包括篮球计分、比赛日程、天气预报、热门比赛、主题切换等功能。

  • 开发环境

平台:Android studio

SDK:Android Platform 32

Virtual device:Nexus 5 API 32

  • 程序流程图

活动跳转图(图1)

 MainActivity框架图(图2)

  • 实现步骤

  • 将活动所需要的图片文件(.jpg或.png)统一保存在drawable文件夹

  • 主活动的布局文件activity_fore.xml

     此处采用约束布局,定义6个Guideline控件、1个ImageView控件、2个EditText控件、2个Button控件。实现代码如下:

                                        
  • 主活动的java文件ForeActivity.java

       此处使用接口的方式注册监听器,监听“开始比赛”或“比赛日程”两个按钮是否被点击,从而执行相关程序 -> start()、schedule()。

      start()使用Intent传递队名等数据信息到第二个活动MainActivity.java,同时进行页面跳转,来到篮球计分界面。

      schedule()使用Intent跳转到第三个活动LastActivity,来到日程安排表,进行球赛日程及球员信息记录。实现代码如下:

package com.example.basketball_scorer;import androidx.appcompat.app.AlertDialog;import androidx.appcompat.app.AppCompatActivity;import android.content.DialogInterface;import android.content.Intent;import android.os.Bundle;import android.text.TextUtils;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;public class ForeActivity extends AppCompatActivity implements View.OnClickListener {    private Button start, schedule;    private EditText edit_text1, edit_text2;    @Override    protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fore); inintView();    }    private void inintView() { //获取按钮id start=findViewById(R.id.start); schedule=findViewById(R.id.schedule); //获取队名id edit_text1=findViewById(R.id.edit_text1); edit_text2=findViewById(R.id.edit_text2); //按钮实现监听 start.setOnClickListener(this); schedule.setOnClickListener(this); edit_text1.setOnClickListener(this); edit_text2.setOnClickListener(this);    }    public void onClick(View v) { switch (v.getId()){     case R.id.start:  start();  break;     case R.id.schedule:  Toast.makeText(ForeActivity.this, "暂无最新比赛日程", Toast.LENGTH_SHORT).show();  break;     default:  break; }    }    private void start() { //判断edit_text1、edit_text2是否填写 String inputText1 = edit_text1.getText().toString(); if(TextUtils.isEmpty(inputText1)) {     Toast.makeText(ForeActivity.this, "请输入主队队名!!!", Toast.LENGTH_SHORT).show();     return; } String inputText2 = edit_text2.getText().toString(); if(TextUtils.isEmpty(inputText2)) {     Toast.makeText(ForeActivity.this, "请输入客队队名!!!", Toast.LENGTH_SHORT).show();     return; } //使用Intent传递数据信息 Intent intent = new Intent(ForeActivity.this, MainActivity.class); intent.putExtra("edit_text1",inputText1); intent.putExtra("edit_text2",inputText2); //启动 startActivity(intent);    }    //schedule函数,实现日程表功能    private void schedule() {    }    //退出应用,弹出提示框    @Override    public void onBackPressed() { //弹出提示框,提示用户你是否要退出 AlertDialog.Builder builder=new AlertDialog.Builder(ForeActivity.this); builder.setTitle("提示"); builder.setIcon(R.drawable.warning); builder.setMessage("你确定退出应用吗?"); builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {     @Override     public void onClick(DialogInterface dialog, int which) {  ForeActivity.this.finish();     } }); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {     @Override     public void onClick(DialogInterface dialog, int which) {  dialog.dismiss();     } }); AlertDialog dialog = builder.create(); dialog.show();    }}

  • 第二个活动的布局文件activity_main.xml

      此处采用约束布局,定义5个Guideline控件、2个ImageView控件、5个TextView控件、6个Button控件。实现代码如下:

                                        
  • 第二个活动的菜单文件main.xml

        此处设置一、二级菜单,减少屏幕控件占比,整洁干净。实现代码如下:

                                                                             
  • 第二个活动的java文件MainActivity.java

      此处使用接口的方式注册监听器,监听各类型的控件,实现分数加1、分数加2、分数加3、分数撤回、分数置0等功能;调用onOptionsItemSelected(MenuItem item) 方法,处理一、二级菜单的点击事件;调用Intent方法,跳转到热门比赛、天气预报等网站。

      实现代码如下:

package com.example.basketball_scorer;import android.content.DialogInterface;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.widget.Button;import android.widget.ImageView;import android.widget.TextView;import android.widget.Toast;import androidx.appcompat.app.AlertDialog;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity implements View.OnClickListener {    //定义数组存放加分    private  final  int scoreArray[]={1,2,3};    private  int lastScore_a,lastScore_b,score_a,score_b;  // lastScore:上一次加的分数  score:总分数    private Button add_a1,add_a2,add_a3,add_b1,add_b2,add_b3;    private ImageView img_cancel,img_reset;    private TextView tv,master_name,guest_name,test_score_a,test_score_b;    @Override    protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent intent = getIntent(); String inputText1 = intent.getStringExtra("edit_text1"); String inputText2 = intent.getStringExtra("edit_text2"); inintView(); master_name.setText(inputText1); guest_name.setText(inputText2);    }    private void inintView() { //获取按钮id add_a1=findViewById(R.id.add_a1); add_a2=findViewById(R.id.add_a2); add_a3=findViewById(R.id.add_a3); add_b1=findViewById(R.id.add_b1); add_b2=findViewById(R.id.add_b2); add_b3=findViewById(R.id.add_b3); //得分情况和清零 img_cancel=findViewById(R.id.img_cancel); img_reset=findViewById(R.id.img_reset); tv=findViewById(R.id.textView); master_name=findViewById(R.id.textView1); guest_name=findViewById(R.id.textView2); test_score_a=findViewById(R.id.score_a); test_score_b=findViewById(R.id.score_b); //按钮实现监听 add_a1.setOnClickListener(this); add_a2.setOnClickListener(this); add_a3.setOnClickListener(this); add_b1.setOnClickListener(this); add_b2.setOnClickListener(this); add_b3.setOnClickListener(this); img_reset.setOnClickListener(this); img_cancel.setOnClickListener(this);    }    //菜单栏    public boolean onCreateOptionsMenu(Menu menu){ getMenuInflater().inflate(R.menu.main,menu); return true;    }    //处理菜单点击事件    public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()){     case R.id.item_1:  Intent intent1 = new Intent(Intent.ACTION_VIEW);  intent1.setData(Uri.parse("https://xw.qq.com/m/nba/vs"));  startActivity(intent1);  Toast.makeText(MainActivity.this, "1", Toast.LENGTH_SHORT).show();  break;     case R.id.item_2:  Intent intent2 = new Intent(Intent.ACTION_VIEW);  intent2.setData(Uri.parse("https://m.tianqi.com/"));  startActivity(intent2);  Toast.makeText(MainActivity.this, "2", Toast.LENGTH_SHORT).show();  break;     case R.id.item_3:  Toast.makeText(MainActivity.this, "请选择你喜爱的主题", Toast.LENGTH_SHORT).show();  break;     case R.id.item_4:  Toast.makeText(MainActivity.this, "更多服务请等待进一步完善", Toast.LENGTH_SHORT).show();  break;     case R.id.original:  tv.setBackgroundResource(R.drawable.original);  Toast.makeText(MainActivity.this, "主题已更改", Toast.LENGTH_SHORT).show();  break;     case R.id.warriors:  tv.setBackgroundResource(R.drawable.warriors);  Toast.makeText(MainActivity.this, "主题已更改", Toast.LENGTH_SHORT).show();  break;     case R.id.lakers:  tv.setBackgroundResource(R.drawable.lakers);  Toast.makeText(MainActivity.this, "主题已更改", Toast.LENGTH_SHORT).show();  break;     case R.id.hawks:  tv.setBackgroundResource(R.drawable.hawks);  Toast.makeText(MainActivity.this, "主题已更改", Toast.LENGTH_SHORT).show();  break;     case R.id.dallas:  tv.setBackgroundResource(R.drawable.dallas);  Toast.makeText(MainActivity.this, "主题已更改", Toast.LENGTH_SHORT).show();  break;     case R.id.nets:  tv.setBackgroundResource(R.drawable.nets);  Toast.makeText(MainActivity.this, "主题已更改", Toast.LENGTH_SHORT).show();  break;     case R.id.sixers:  tv.setBackgroundResource(R.drawable.sixers);  Toast.makeText(MainActivity.this, "主题已更改", Toast.LENGTH_SHORT).show();  break;     case R.id.nuggets:  tv.setBackgroundResource(R.drawable.nuggets);  Toast.makeText(MainActivity.this, "主题已更改", Toast.LENGTH_SHORT).show();  break;     case R.id.cavaliers:  tv.setBackgroundResource(R.drawable.cavaliers);  Toast.makeText(MainActivity.this, "主题已更改", Toast.LENGTH_SHORT).show();  break;     case R.id.celtics:  tv.setBackgroundResource(R.drawable.celtics);  Toast.makeText(MainActivity.this, "主题已更改", Toast.LENGTH_SHORT).show();  break;     case R.id.hornets:  tv.setBackgroundResource(R.drawable.hornets);  Toast.makeText(MainActivity.this, "主题已更改", Toast.LENGTH_SHORT).show();  break;     default: } return super.onOptionsItemSelected(item);    }    //点击事件    public void onClick(View v) { switch (v.getId()){     case R.id.add_a1:  scoreAdd(0,scoreArray[0]);  break;     case R.id.add_a2:  scoreAdd(0,scoreArray[1]);  break;     case R.id.add_a3:  scoreAdd(0,scoreArray[2]);  break;     case  R.id.add_b1:  scoreAdd(1,scoreArray[0]);  break;     case  R.id.add_b2:  scoreAdd(1,scoreArray[1]);  break;     case  R.id.add_b3:  scoreAdd(1,scoreArray[2]);  break;     case  R.id.img_reset:  reset();  break;     case  R.id.img_cancel:  cancel();  break;     default:  break; }    }    //取消上次加分操作    private void cancel() { if (score_a != 0 && score_a-lastScore_a >= 0){     score_a -= lastScore_a; } if (score_b != 0 && score_b-lastScore_b >= 0){     score_b -= lastScore_b; } Toast.makeText(MainActivity.this, "已取消上次加分操作", Toast.LENGTH_SHORT).show(); ShowText();    }    //重置功能,弹出提示框    private void reset() { //弹出提示框,提示用户你是否要重置 AlertDialog.Builder builder=new AlertDialog.Builder(MainActivity.this); builder.setTitle("提示"); builder.setIcon(R.drawable.warning); builder.setMessage("你确定要重置分数吗?"); builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {     @Override     public void onClick(DialogInterface dialog, int which) {  score_a=0;  score_b=0;  ShowText();  dialog.dismiss();  Toast.makeText(MainActivity.this, "分数已重置", Toast.LENGTH_SHORT).show();     } }); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {     @Override     public void onClick(DialogInterface dialog, int which) {  dialog.dismiss();     } }); AlertDialog dialog = builder.create(); dialog.show();    }    //返回上一层,弹出提示框    @Override    public void onBackPressed() { //弹出提示框,提示用户你是否要退出 AlertDialog.Builder builder=new AlertDialog.Builder(MainActivity.this); builder.setTitle("提示"); builder.setIcon(R.drawable.warning); builder.setMessage("你确定要返回上一层?"); builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {     @Override     public void onClick(DialogInterface dialog, int which) {  MainActivity.this.finish();     } }); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {     @Override     public void onClick(DialogInterface dialog, int which) {  dialog.dismiss();     } }); AlertDialog dialog = builder.create(); dialog.show();    }    //进行加分    private void scoreAdd(int flag, int score){ //Tage:   0:a  1:b if (flag == 0 || flag == 1){     if (flag == 0){  //表示a进行加分  lastScore_b = 0;  lastScore_a = score;  score_a += lastScore_a;     }else if (flag == 1){  //表示对b进行加分  lastScore_a = 0;  lastScore_b = score;  score_b += lastScore_b;     }     ShowText(); }    }    //进行显示    private void ShowText(){ test_score_a.setText(Integer.toString(score_a)); test_score_b.setText(Integer.toString(score_b));    }}
  • 关于res/drawable的图片资源下载地址说明

      App 图标:阿里巴巴矢量图标

      主题图片:百度搜索nba球队地板图

      图片设计:canvas官网

  • 如何将项目app传到手机

(1)生成APK安装包

 (2)打开APK安装包保存地址

(3)将安装包放入自命名的文件夹里,拉到手机,在手机文件资源处进行查看并安装

  • APP效果图