You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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秒倒计时,时间结束后判断游戏结果并重启。

整体为一款简单的瞄准训练游戏,玩家需在限时内点击随机出现的目标,游戏会记录剩余命中次数并给出结果反馈。


编译错误排查及修复方案:

  1. 未注释的文本导致语法错误:
    generate方法中的poza ekran, zmienic jesli dalej to robi是未加注释符号的文本,Java编译器会将其视为无效语句。需在该行前添加//转为注释:

    // poza ekran, zmienic jesli dalej to robi
    
  2. HTML转义字符问题:
    原代码中的"和>是HTML转义字符,Java代码中需替换为原生的双引号"和大于号>,否则编译器会识别为非法字符。

  3. 资源文件缺失:
    代码中调用了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>
    
  4. 布局组件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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 06:44:57