Android Studio瞄准训练器Java代码编译失败,请求排查
Android瞄准训练器代码编译问题排查
正在开发基于Android Studio的瞄准训练器应用,编写了如下Java代码但无法编译,不清楚是语法问题还是缺少必要配置。
原代码:
import androidx.appcompat.app.AppCompatActivity; import android.annotation.SuppressLint; import android.os.Bundle; import android.os.CountDownTimer; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.FrameLayout; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import java.util.Random; import java.util.concurrent.TimeUnit; public class MainActivity extends AppCompatActivity { Button button; RelativeLayout relativeLayout; int time; int hitsLeft; int maxWidth; int maxHeight; TextView timeTextView; TextView hitsTextView; TextView TextViewToHit; @SuppressLint("MissingInflatedId") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); time = 10; hitsLeft = 5; button = findViewById(R.id.startButton); relativeLayout = findViewById(R.id.relLayout); timeTextView = findViewById(R.id.timeTextView); hitsTextView = findViewById(R.id.hitsTextView); TextViewToHit = new TextView(this); relativeLayout.addView(TextViewToHit); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { button.setVisibility(View.GONE); countdown(); generate(); } }); TextViewToHit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (hitsLeft > 0) { generate(); hitsLeft--; hitsTextView.setText("Left hit:" + hitsLeft); } else { hitsTextView.setText("Left hit:" + hitsLeft); Toast.makeText(MainActivity.this,"Congrats!", Toast.LENGTH_SHORT).show(); restart(); } } }); } private void generate() { if (hitsLeft != 0) { TextViewToHit.setText(" "); TextViewToHit.setTextSize(70); TextViewToHit.setBackgroundResource(R.drawable.circle); TextViewToHit.setVisibility(View.VISIBLE); poza ekran, zmienic jesli dalej to robi maxHeight = relativeLayout.getHeight() - TextViewToHit.getHeight() - 70; maxWidth = relativeLayout.getWidth() - TextViewToHit.getWidth() - 70; Random random = new Random(); int x = random.nextInt(maxWidth); int y = random.nextInt(maxHeight); RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT ); layoutParams.leftMargin = x; layoutParams.topMargin = y; TextViewToHit.setLayoutParams(layoutParams); hitsTextView.setText("Left hit:" + hitsLeft); } } private void restart() { relativeLayout.removeView(TextViewToHit); time = 10; hitsLeft = 5; hitsTextView.setText("Left hit:" + hitsLeft); timeTextView.setText("Time: "+ time); button.setVisibility(View.VISIBLE); } private void countdown() { new CountDownTimer(10000, 1000) { public void onTick(long millisUntilFinished) { timeTextView.setText("Time: " + millisUntilFinished / 1000); } public void onFinish() { timeTextView.setText("Time: 0"); relativeLayout.removeView(TextViewToHit); if (hitsLeft != 0) { Toast.makeText(MainActivity.this, "You failed, try again", Toast.LENGTH_LONG).show(); restart(); } } }.start(); } }
代码功能说明:
- Activity设置:MainActivity继承AppCompatActivity,处理应用核心逻辑。
- 布局初始化:onCreate方法加载activity_main.xml布局,初始化按钮、文本视图等UI组件。
- 游戏初始化:设置初始游戏参数(时间10秒,剩余命中次数5次)。
- 按钮点击监听:点击开始按钮后隐藏按钮,启动倒计时并生成目标。
- 目标生成:generate方法在布局内随机位置生成TextView作为目标,更新剩余命中次数。
- 目标点击监听:点击目标后生成新目标,递减剩余命中次数,完成后显示提示并重启游戏。
- 重启方法:重置游戏参数,移除目标TextView,显示开始按钮。
- 倒计时计时器:countdown方法启动10秒倒计时,时间结束后判断游戏结果并重启。
整体为一款简单的瞄准训练游戏,玩家需在限时内点击随机出现的目标,游戏会记录剩余命中次数并给出结果反馈。
编译错误排查及修复方案:
未注释的文本导致语法错误:
generate方法中的poza ekran, zmienic jesli dalej to robi是未加注释符号的文本,Java编译器会将其视为无效语句。需在该行前添加//转为注释:// poza ekran, zmienic jesli dalej to robiHTML转义字符问题:
原代码中的"和>是HTML转义字符,Java代码中需替换为原生的双引号"和大于号>,否则编译器会识别为非法字符。资源文件缺失:
代码中调用了R.drawable.circle,需确保res/drawable目录下存在circle.xml形状资源文件(用于绘制圆形目标),示例代码如下:<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <solid android:color="#FF4081"/> <size android:width="100dp" android:height="100dp"/> </shape>布局组件ID检查:
确认activity_main.xml布局文件中存在以下ID:startButton、relLayout、timeTextView、hitsTextView,否则findViewById会导致编译警告或运行时崩溃。
修复后的核心代码片段(generate方法):
private void generate() { if (hitsLeft != 0) { TextViewToHit.setText(" "); TextViewToHit.setTextSize(70); TextViewToHit.setBackgroundResource(R.drawable.circle); TextViewToHit.setVisibility(View.VISIBLE); // poza ekran, zmienic jesli dalej to robi maxHeight = relativeLayout.getHeight() - TextViewToHit.getHeight() - 70; maxWidth = relativeLayout.getWidth() - TextViewToHit.getWidth() - 70; Random random = new Random(); int x = random.nextInt(maxWidth); int y = random.nextInt(maxHeight); RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT ); layoutParams.leftMargin = x; layoutParams.topMargin = y; TextViewToHit.setLayoutParams(layoutParams); hitsTextView.setText("Left hit:" + hitsLeft); } }
内容的提问来源于stack exchange,提问作者qwerty_45
相关产品推荐
相关产品推荐

