话不多说,我们来做一个简易的计分器,这个小项目适合初学者,大神路过也可指点一二,不胜感激!
jdk1.8及以上(java向下兼容特性,只要版本在1.8或以上都可以运行起来示例项目)
Android Studio 3.4.2
minSdkVersion 15
targetSdkVersion 29
篮球比赛计分(1、2、3分),需两个队伍独立计分,重置所有得分,结算比赛结果。
乒乓球比赛计分(大分、小分),11球制,如果本局获胜那么获胜方需比对手多两个球及以上并大于等于11球。
例如:11:10不算获胜 11:9前者胜 11:13后者胜。
这里需要制作三个页面,主页、篮球比赛计分页、乒乓球比赛计分页。
采用RelativeLayout和LinearLayout混合布局,灵活嵌套,可以达到我们想要的效果。
主页布局示意图
篮球比赛计分页布局示意图
乒乓球比赛计分页布局示意图
本人编写的示例代码布局比上述嵌套稍稍繁琐一点儿,但大体上是这样的布局
此处略过,没有多大难度,可参考文末示例代码
稍加分析,我们需要三个Activity分别实现主页、篮球比赛计分页、乒乓球比赛计分页。
private void alert(String title, String message) {
/*
* 提示信息
* */
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(title);
builder.setMessage(message);
builder.show();
}
private void alert(String message) { //重载,达到默认参数的效果
/*
* 提示信息
* */
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("提示");
builder.setMessage(message);
builder.show();
}
public void teamA_AddScore(View view) {
/*
* Team A加score分
* @Param oldScore 原成绩
* @Param score 要加的成绩
* */
TextView teamAScore = (TextView) findViewById(R.id.teamAScore);
int oldScore = Integer.parseInt(teamAScore.getText().toString());
int score = Integer.parseInt(view.getTag().toString());
//注,这个位置的getTag是为了调用此函数时传参数值
teamAScore.setText("" + (score + oldScore));
}
private boolean judgeWiner(int score1, int score2) {
/*
* 判断单局胜负和分数限定
* */
if (Math.abs(score1 - score2) <= 1) {
return false; //没赢下本局
} else {
if (score1 < 11) return false; //没赢下本局
else return true; //前者赢下本局
}
}
public void teamA_AddScore(View view) {
/*
* TeamA加分 大分被动更新
* */
TextView teamA_SmallScore = findViewById(R.id.teamA_SmallScore);
int teamA_smallScore = Integer.parseInt(teamA_SmallScore.getText().toString());
TextView teamB_SmallScore = findViewById(R.id.teamB_SmallScore);
int teamB_smallScore = Integer.parseInt(teamB_SmallScore.getText().toString());
teamA_smallScore++;
if (judgeWiner(teamA_smallScore, teamB_smallScore)) {
//team A 赢下本局,大分加一,小分全部置零,弹出本局team A 本局获胜信息
TextView teamA_BigScore = findViewById(R.id.teamA_BigScore);
int teamA_bigScore = Integer.parseInt(teamA_BigScore.getText().toString());
teamA_bigScore++;
teamA_BigScore.setText("" + teamA_bigScore);
teamA_SmallScore.setText("0");
teamB_SmallScore.setText("0");
alert("本局Team A获胜,大分加一!");
} else {
teamA_SmallScore.setText("" + teamA_smallScore);
}
}
public void reset(View view) {
/*
* 重置比分
* */
TextView teamAScore = (TextView) findViewById(R.id.teamAScore);
TextView teamBScore = (TextView) findViewById(R.id.teamBScore);
teamAScore.setText("0");
teamBScore.setText("0");
/*
* 发送提示信息
* */
alert("重置成功!");
}
public void reset(View view) {
/*
* 重置比分
* */
TextView teamA_BigScore = findViewById(R.id.teamA_BigScore);
TextView teamB_BigScore = findViewById(R.id.teamB_BigScore);
TextView teamA_SmallScore = findViewById(R.id.teamA_SmallScore);
TextView teamB_SmallScore = findViewById(R.id.teamB_SmallScore);
teamA_BigScore.setText("0");
teamB_BigScore.setText("0");
teamA_SmallScore.setText("0");
teamB_SmallScore.setText("0");
/*
* 发送提示信息
* */
alert("重置成功!");
}
public void over(View view) {
/*
* 结算比赛得分
* */
TextView teamAScore = findViewById(R.id.teamAScore);
TextView teamBScore = findViewById(R.id.teamBScore);
int teamAscore = Integer.parseInt(teamAScore.getText().toString());
int teamBscore = Integer.parseInt(teamBScore.getText().toString());
if(teamAscore == teamBscore)alert("比赛结果","难分伯仲!");
else if(teamAscore > teamBscore)alert("比赛结果","Team A取得了最后胜利!");
else alert("比赛结果","Team B取得了最后胜利!");
}
public void over(View view) {
/*
* 结算比赛得分
* */
TextView teamA_BigScore = findViewById(R.id.teamA_BigScore);
TextView teamB_BigScore = findViewById(R.id.teamB_BigScore);
int teamA_bigScore = Integer.parseInt(teamA_BigScore.getText().toString());
int teamB_bigScore = Integer.parseInt(teamB_BigScore.getText().toString());
if(teamA_bigScore > teamB_bigScore)alert("比赛结果","Team A取得了最后胜利!");
else if (teamA_bigScore < teamB_bigScore)alert("比赛结果","Team B取得了最后胜利!");
else { //大分相等,比较小分
TextView teamA_SmallScore = findViewById(R.id.teamA_SmallScore);
TextView teamB_SmallScore = findViewById(R.id.teamB_SmallScore);
int teamA_smallScore = Integer.parseInt(teamA_SmallScore.getText().toString());
int teamB_smallScore = Integer.parseInt(teamB_SmallScore.getText().toString());
if(teamA_smallScore == teamB_smallScore) alert("比赛结果","难分伯仲!");
else if (teamA_smallScore > teamB_smallScore) alert("比赛结果","Team A取得了最后胜利!");
else alert("比赛结果","Team B取得了最后胜利!");
}
}
如果你想要实现应用开始时弹出软件声明,且只在应用启动时启动有且仅启动一次,可以这样实现
1、先创建一个App.java继承Application,且在AndroidManifest.xml的application标签上加一个属性android:name=".App",这样就自定义了一个Application;
2、在App类中声明一个静态boolean变量,并赋默认值,例:
private static boolean newSession = true;
这个变量将表示是否为第一次进入应用,默认为true;
3、为上述静态变量设置静态的get、set方法;
以上完成的App类内容如下:
public class App extends Application {
//是否第一次进入MainActivity
private static boolean newSession = true;
public static boolean getNewSession(){
return newSession;
}
public static void setNewSession(){
newSession = false;
}
}
4、在MainActivity中的onCreate函数中添加
if (App.getNewSession()) { //第一次访问时弹出
alert("声明", "声明内容");eq
App.setNewSession();
}
5、此时声明内容就只会在应用启动时弹出一次,上述用静态方法直接调用是为了保证App对象保持唯一单例。
至此,一个简单的计分器就这样完成了,只需稍加修饰,换个图标,就可导出apk装到手机上体验第一次写Android应用的快感了
注:功能内已经导出 计分器.apk 可装到手机内体验,apk文件位置 CourtCounter\app\release
点此去下载 提取码:btk0