swicth文のcaseに設定する値はコンパイル時に値が確定するもの(定数式)である必要があるようです。
要するにfinal int i = 1
、final int j = i
のような実行時に変更されず(finalが付いてる)、かつ代入される値も定数でないといけません。
今回のパターンですとR.id.btn1
はコンパイル時にどのような値になるかがわからないのでエラーとなっているのだと思います。
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修飾子をつければいいのかがわかりません。
swicth文のcaseに設定する値はコンパイル時に値が確定するもの(定数式)である必要があるようです。
要するにfinal int i = 1
、final int j = i
のような実行時に変更されず(finalが付いてる)、かつ代入される値も定数でないといけません。
今回のパターンですとR.id.btn1
はコンパイル時にどのような値になるかがわからないのでエラーとなっているのだと思います。
@yato_minagumo
Questionerご回答いただきありがとうございます!
やはりR.id.btn1
が変数なのが問題ですよね。
実はyoutubeの動画を見ながらコード模写していて、動画ではswitch文でいけてたので、R.id.btn1
は定数になるのかと思っていたのですが、何か見落としていたかバージョンアップにより仕様が変わったとかですかね・・・
R.id
のメンバはAPIレベル14から定数でなくなったようです.
昔は生成されるリソースIDにfinal
が付いていましたが、いつからか付かなくなったのでそういう書き方ができなくなったようですね。
@yato_minagumo
Questionerそういうことだったんですね!
ではやはりif文しかないということですか・・・
教えていただいてありがとうございます!!