尝试创建 switch case 块时需要常量表达式

Kay*_*eru 7 java xml android android-layout android-studio-flamingo

`错误不断显示“需要恒定的表达式”,阻止我在设备上运行该应用程序以进一步开发该应用程序。

我正在尝试创建一种谷歌支付..所以我需要选定的金额。但我收到一个错误,说“需要常量表达式”。该变量被声明为私有而不是最终的,所以我不知道为什么会收到此错误。该值甚至没有突出显示,表明它正在被使用。我该如何解决这个错误。我尝试将变量初始化为零,但它仍然没有帮助..`


package com.example.greenearth;

import android.media.Image;
import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RelativeLayout;
import android.widget.Toast;


public class Donations extends Fragment {

    RadioGroup radioGroup;
    RadioButton minimum;
    RadioButton average;
    RadioButton maximum;
    private int google_amount=0;

    RelativeLayout rl;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_donations, container, false);

    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        radioGroup=view.findViewById(R.id.select);
        minimum=view.findViewById(R.id.fifty);
        average=view.findViewById(R.id.five_hundred);
        maximum=view.findViewById(R.id.ten_thousand);
        rl=view.findViewById(R.id.donater);

        radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                switch (checkedId){
                    case R.id.fifty:
                        google_amount=50;
                        break;

                    case R.id.five_hundred:
                        google_amount=500;
                        break;

                    case R.id.ten_thousand:
                        google_amount=10000;
                        break;
                }
            }
        });

        rl.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (google_amount>0) {
                    //googlepay
                } else {
                    Toast.makeText(getContext(),"Please choose an amount", Toast.LENGTH_SHORT).show();
                }
            }
        });

    }
}
Run Code Online (Sandbox Code Playgroud)

Til*_*ill 30

从 Android Gradle Plugin 8.0.0 开始,默认情况下,您的资源(例如R.id. ...)不再声明final(即常量表达式)以优化构建速度,这是在 switch 语句中使用的先决条件: https://developer.android。 com/build/optimize-your-build#use-non-constant-r-classes

如果您想保留旧的行为,可以在gradle.properties文件中添加以下行:

android.nonFinalResIds=false
Run Code Online (Sandbox Code Playgroud)

如果您想通过将其转换为 if/else 语句来修复它,Android Studio 将帮助您

Ctrl+1

Alt+Enter

关于switch关键字。


小智 12

把这条线

android.nonFinalResIds=false
Run Code Online (Sandbox Code Playgroud)

在此文件中并同步

gradle.properties
Run Code Online (Sandbox Code Playgroud)

这对我有用


小智 3

将 switch 语句替换为 if 条件,如下所示

 radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId) {

            if (checkedId == R.id.fifty) {
                google_amount = 50;
            } else if (checkedId == R.id.five_hundred) {
                google_amount = 500;
            } else if (checkedId == R.id.ten_thousand) {
                google_amount = 10000;
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)

如果遇到“需要常量表达式”错误,请确保 switch 语句中使用的表达式确实是常量表达式。如果需要计算非常量表达式,您可以考虑使用 if-else 语句。