自分が経験したエラーの解決方法

2024年6月28日

M1 Mac(Apple Silicon )は64ビットARM
Android Studioバージョン:android-studio-2023.1.1.28-mac_arm.dmg

この辺のバージョンにするとYoutube等で説明されているスクリプトと若干違う部分が良く出てくるようになる。そのため前に進めないときがあるが、以下の部分ではうまくいった。

switch文を使うとエラーになる、解決はif文にすること

switchのcase文にR.idを入れたらエラーになるらしい、定数として扱えないということらしい。

<例題1>

以下はswitch文でメニューを切り替えているが、新しいAndroid Studioではエラーになる。

 private void bottomMenu() {

        chipNavigationBar.setOnItemSelectedListener(new ChipNavigationBar.OnItemSelectedListener() {
            @Override
            public void onItemSelected(int i) {
                Fragment fragment = null;
                
                switch (i) {
                    case R.id.home:
                        fragment = new MyNotesFragment();
                        break;
                    case R.id.reminder:
                        fragment = new ReminderFragment();
                        break;
                    case R.id.shopping_list:
                        fragment = new ShoppingListFragment();
                        break;
                }
                 getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragment).commit();
            }
        });
    }

以下のようにif文にすると問題なく使えるようになる。下のバー内のアイコンを「i」が、1番目、2番目を選択した状態を表している。

private void bottomMenu() {

        chipNavigationBar.setOnItemSelectedListener(new ChipNavigationBar.OnItemSelectedListener() {
            @Override
            public void onItemSelected(int i) {
                Fragment fragment = null;
                if (i == R.id.home) {
                    fragment = new MyNotesFragment();
                }else if (i == R.id.reminder){
                    fragment = new ReminderFragment();
                }else {
                    fragment = new ShoppingListFragment();
                }
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragment).commit();
            }
        });
    }

<例題2>

以下も case (R.id.roombtnadd): で R.id.roombtnaddに赤波線が入りエラーになってビルドできない。

v.getId()というのはidを取得するわけだから、そのidと同じだったらどうするかということになる。

@Override
public void onClick(View v) {
        switch (v.getId()) {
            //ボタンにクリック時の機能を実装する
            //loaddbにデータが保存されていない時の処理を追加する
            case (R.id.roombtnadd)://追加ボタンが押された時
                writedb();//データを書き込む
                break;
        }
}

if文にすると問題なくビルドできるようになる。最初の3番めの行を外してbuttonIdのところに直接「v.getId()」を入れても良い。しかしif文が続く場合はこれが分かりやすいと思う。

この場合、ボタンのid名が「roombtnadd」なら{}内を実行するということになる。

@Override
public void onClick(View v) {
        int buttonId = v.getId();//idをゲットする
        if(buttonId == R.id.roombtnadd){
            writedb();//データを書き込む
}

Roomの依存設定

dependenciesに入れる場合は implementation(”◯◯◯◯◯◯◯◯”)とする必要がある。

implementation("androidx.room:room-runtime:2.3.0")
annotationProcessor("androidx.room:room-compiler:2.3.0")

maven { url ‘https://jitpack.io’ }を入れる場合、一番上でなく一番下の「settings.gradle.kts」に入れて以下のように記述する必要がある。

maven { url = uri(“https://jitpack.io”) }

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        maven {
            url = uri("https://jitpack.io")
        }
    }
}

M1 Macでerror: java.lang.ExceptionInInitializerErrorと出る

M1 Macの場合これはRoomのバージョンが2.3.0で出るようだ、以下のように最新2.6.1に変更したらビルドできた。

implementation(“androidx.room:room-runtime:2.6.1“)
annotationProcessor(“androidx.room:room-compiler:2.6.1“)