LoginSignup
yato_minagumo
@yato_minagumo

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Android studioでswitch文を使うとエラーが出る

解決したいこと

Android studioの学習を始めたばかりの初心者です。
簡単な電卓アプリを制作している時にswicth文を使ってみたら、定数式が必要というエラーが出てしまいました。

エラー: 定数式が必要です
            case R.id.btn1:
                     ^

if文に書き直すことも考えましたが、今後のためにも何が原因か知っておきたいです。

該当するソースコード

package com.example.calculate;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.util.Log;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button btn1;
    private Button btn2;

    (

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn1 = findViewById(R.id.btn1);
        btn1.setOnClickListener(this);
        btn2 = findViewById(R.id.btn2);
        btn2.setOnClickListener(this);

        (

        calctext = findViewById(R.id.calctext);

    }

    @Override
    public void onClick(View view) {
        Log.d("MainActivity", "Button ID: " + view.getId());
        switch(view.getId()) {

            case R.id.btn1: //問題の箇所
                calctext.setText("1");
                break;

        }

    }
}

自分で試したこと

LogcatでボタンIDが取得できているかを確認してみたのですが、特に何も表示されませんでした。
定数式についても調べてみましたが、final修飾子がつくものということまでは理解できましたが、どこにfinal修飾子をつければいいのかがわかりません。

0

2Answer

swicth文のcaseに設定する値はコンパイル時に値が確定するもの(定数式)である必要があるようです。

要するにfinal int i = 1final int j = iのような実行時に変更されず(finalが付いてる)、かつ代入される値も定数でないといけません。

今回のパターンですとR.id.btn1はコンパイル時にどのような値になるかがわからないのでエラーとなっているのだと思います。

0Like

Comments

  1. @yato_minagumo

    Questioner

    ご回答いただきありがとうございます!

    やはりR.id.btn1が変数なのが問題ですよね。

    実はyoutubeの動画を見ながらコード模写していて、動画ではswitch文でいけてたので、R.id.btn1は定数になるのかと思っていたのですが、何か見落としていたかバージョンアップにより仕様が変わったとかですかね・・・

  2. R.idのメンバはAPIレベル14から定数でなくなったようです.

昔は生成されるリソースIDにfinalが付いていましたが、いつからか付かなくなったのでそういう書き方ができなくなったようですね。

0Like

Comments

  1. @yato_minagumo

    Questioner

    そういうことだったんですね!
    ではやはりif文しかないということですか・・・
    教えていただいてありがとうございます!!

Your answer might help someone💌