質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.02%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

選択したボタンのボタンの無効化とテキストの変更がしたい

moganite
moganite

総合スコア1

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

1回答

0グッド

0クリップ

325閲覧

投稿2022/11/19 07:07

前提

android Studioで独学でアプリ制作をしています。

実現したいこと

席の予約ができるようなシステムを創ろうとしています。選択したボタンのテキストを予約済みと変更し、ボタンは無効化します。また、データベースと接続し、次開いたときには予約済みのボタンを無効化している状態で開けるようにしたいです。
これらのことから、今はボタンの有効化とテキストの変更に取り組んでいるのですが、次のエラーを直すことができません。

発生している問題・エラーメッセージ

エラーメッセージ Cannot resolve symbol 'bt1'

android studioの再起動は試しましたが、駄目でした。また、次のサイトを参考にしています。
https://zerokara-app.com/299/
とりあえずボタン1で試しに実行しているので、大変見づらいと思いますが助言をお願い致します。

該当のソースコード

ソースコード package es.exsample; import androidx.appcompat.app.AppCompatActivity; import android.content.ContentValues; import android.content.Intent; import android.os.Bundle; import androidx.annotation.NonNull; import android.database.*; import android.database.sqlite.*; import android.os.*; import android.widget.*; import android.view.*; import android.view.View.*; import android.database.*; import android.database.sqlite.*; import android.graphics.Color; import android.view.View; import android.widget.Button; import android.widget.TextView; public class Ex_seat extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.ex_seat); //ボタンビューを取得 Button bt1 = (Button) findViewById(R.id.seat01); Button bt2 = (Button) findViewById(R.id.seat02); Button bt3 = (Button) findViewById(R.id.seat03); Button bt4 = (Button) findViewById(R.id.seat04); Button bt5 = (Button) findViewById(R.id.seat05); Button bt6 = (Button) findViewById(R.id.seat06); Button bt7 = (Button) findViewById(R.id.seat07); Button bt8 = (Button) findViewById(R.id.seat08); Button bt9 = (Button) findViewById(R.id.seat09); //ボタンを押されたときの動作を持つインスタンスを生成 ButtonClickListener listener = new ButtonClickListener(); bt1.setOnClickListener(listener); bt2.setOnClickListener(listener); bt3.setOnClickListener(listener); bt4.setOnClickListener(listener); String str = "data/data/" + getPackageName() + "/Sample.db"; //データベースの保存先の指定 SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(str, null); //データベースオブジェクトの生成 String qry0 = "DROP TABLE IF EXISTS site"; //テーブルリセットのクエリ String qry1 = "CREATE TABLE site" + "(id INTEGER PRIMARY KEY, num INTEGER, flg INTEGER)"; //テーブル作成のクエリ String[] qry2 = {"INSERT INTO site(num, flg) VALUES (01, 0)", //データ挿入のクエリ "INSERT INTO site(num, flg) VALUES (02, 0)", "INSERT INTO site(num, flg) VALUES (03, 0)", "INSERT INTO site(num, flg) VALUES (04, 0)", "INSERT INTO site(num, flg) VALUES (05, 0)", "INSERT INTO site(num, flg) VALUES (06, 0)", "INSERT INTO site(num, flg) VALUES (07, 0)", "INSERT INTO site(num, flg) VALUES (08, 0)", "INSERT INTO site(num, flg) VALUES (09, 0)"}; String qry3 = "SELECT * FROM site"; //データ選択のクエリ String qry4 = "UPDATE site SET flg = 1 where num = 01"; db.execSQL(qry4); // db.execSQL(qry0); クエリの実行 2回目以降の実行する際にはコメントアウトする //db.execSQL(qry1); 2回目以降の実行する際にはコメントアウトする //for(int i=0; i<qry2.length; i++) 2回目以降の実行する際にはコメントアウトする // db.execSQL(qry2[i]); //Cursor cr = db.rawQuery(qry3, null); //クエリ結果をカーソルで受け取り //ArrayAdapter<String> ad = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1); //結果出力のリスト db.close(); //データベースのクローズ ///button1.setOnClickListener(new View.OnClickListener() { ///@Override ///public void onClick(View v) { //db.execSQL(qry4); //button1.setText("予約済み");//ボタンtextの変更 //button1.setEnabled(false);//ボタンの無効化 //Intent intent = new Intent(getApplication(),Ex_seat.class); //startActivity(intent); //} //}); } private class ButtonClickListener implements View.OnClickListener { @Override public void onClick(View view) { int id = view.getId(); switch (id) { case R.id.seat01: bt1.setText("予約済み");//ボタンtextの変更 bt1.setEnabled(false);//ボタンの無効化 break; case R.id.seat02: bt2.setText("予約済み");//ボタンtextの変更 break; case R.id.seat03: bt3.setText("予約済み");//ボタンtextの変更 break; case R.id.seat04: bt4.setText("予約済み");//ボタンtextの変更 break; } } } } 問題に対して試したことを記載してください。 ### 補足情報(FW/ツールのバージョンなど) Android Studio Dolphin 2021.3.1を使用しています。 ここにより詳細な情報を記載してください。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

hoshi-takanori

2022/11/19 07:53

bt1 〜 bt9 は onCreate メソッドのローカル変数なので、onClick など、別のメソッドからはアクセスできません。 (また、余計なお世話ですが、bt1 〜 bt9 のように変数をたくさん作るより、配列を使うなどの工夫をするといいかも…。)
jimbe

2022/11/19 08:42 編集

とりあえず、コードのマークダウン( ``` ) はコードだけを囲うようにしてください。 それと、 SQLiteDatabase をなぜこんな形で利用しちゃってるのか…SQLiteOpenHelper を利用してください。
moganite

2022/11/19 11:36

なるほど。その場合、クリック処理でそのボタンで何かしら処理をしたい場合はどのように記述すればよいのでしょうか?
jimbe

2022/11/19 18:09

onClick のパラメータ view は、押された Button です。

回答1

2

ベストアンサー

質問自体には"質問へのコメント"で hoshi-takanori さんの書き込みが回答に成っている( google 検索「java 変数 スコープ」 )と思いますので、配列化とか SQLiteOpenHelper とかにしてみます。
毎回コードを編集してデータをクリアしてテストするのは面倒ですので、クリアボタンを付けました。

MainActivity.java

java

1import androidx.appcompat.app.AppCompatActivity; 2 3import android.content.ContentValues; 4import android.database.Cursor; 5import android.database.sqlite.SQLiteDatabase; 6import android.os.Bundle; 7import android.widget.Button; 8 9public class MainActivity extends AppCompatActivity { 10 private DatabaseHelper helper; 11 12 @Override 13 protected void onCreate(Bundle savedInstanceState) { 14 super.onCreate(savedInstanceState); 15 setContentView(R.layout.activity_main); 16 17 helper = new DatabaseHelper(this); 18 19 int[] seatIds = new int[] { 20 R.id.seat01, R.id.seat02, R.id.seat03, R.id.seat04, R.id.seat05, 21 R.id.seat06, R.id.seat07, R.id.seat08, R.id.seat09, 22 }; 23 Button[] buttons = new Button[seatIds.length]; 24 for(int i=0; i<seatIds.length; i++) { 25 buttons[i] = findViewById(seatIds[i]); 26 buttons[i].setTag(i+1); //num 27 setFlgTo(buttons[i], true); 28 buttons[i].setOnClickListener(v -> { 29 updateSite((Integer)v.getTag(), 1); 30 setFlgTo((Button)v, false); 31 }); 32 } 33 34 Button clear = findViewById(R.id.clear); 35 clear.setOnClickListener(v -> clearSites(buttons)); 36 37 SQLiteDatabase db = helper.getReadableDatabase(); //クローズしない 38 try(Cursor cursor = db.rawQuery("SELECT num,flg FROM site", null)) { //クローズする 39 int numIndex = cursor.getColumnIndex("num"); 40 int flgIndex = cursor.getColumnIndex("flg"); 41 while(cursor.moveToNext()) { 42 int num = cursor.getInt(numIndex); 43 int flg = cursor.getInt(flgIndex); 44 if(1 <= num && num <= buttons.length) setFlgTo(buttons[num-1], flg == 0); 45 } 46 } 47 } 48 49 private void setFlgTo(Button button, boolean vacancy) { 50 button.setText(String.format("%02d ", (Integer)button.getTag())+(vacancy ? "空席" : "予約済み")); 51 button.setEnabled(vacancy); 52 } 53 54 private void updateSite(int num, int flg) { 55 SQLiteDatabase db = helper.getWritableDatabase(); //クローズしない 56 ContentValues values = new ContentValues(); 57 values.put("flg", flg); 58 db.update("site", values, "num=?", new String[]{""+num}); 59 } 60 61 private void clearSites(Button[] buttons) { 62 for(Button button : buttons) { 63 updateSite((Integer)button.getTag(), 0); 64 setFlgTo(button, true); 65 } 66 } 67}

res/layout/activity_main.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<LinearLayout 3 xmlns:android="http://schemas.android.com/apk/res/android" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 android:orientation="vertical" 8 tools:context=".MainActivity"> 9 10 <Button 11 android:id="@+id/seat01" 12 android:layout_width="wrap_content" 13 android:layout_height="wrap_content" /> 14 <Button 15 android:id="@+id/seat02" 16 android:layout_width="wrap_content" 17 android:layout_height="wrap_content" /> 18 <Button 19 android:id="@+id/seat03" 20 android:layout_width="wrap_content" 21 android:layout_height="wrap_content" /> 22 <Button 23 android:id="@+id/seat04" 24 android:layout_width="wrap_content" 25 android:layout_height="wrap_content" /> 26 <Button 27 android:id="@+id/seat05" 28 android:layout_width="wrap_content" 29 android:layout_height="wrap_content" /> 30 <Button 31 android:id="@+id/seat06" 32 android:layout_width="wrap_content" 33 android:layout_height="wrap_content" /> 34 <Button 35 android:id="@+id/seat07" 36 android:layout_width="wrap_content" 37 android:layout_height="wrap_content" /> 38 <Button 39 android:id="@+id/seat08" 40 android:layout_width="wrap_content" 41 android:layout_height="wrap_content" /> 42 <Button 43 android:id="@+id/seat09" 44 android:layout_width="wrap_content" 45 android:layout_height="wrap_content" /> 46 <Space 47 android:layout_width="0dp" 48 android:layout_height="30dp" /> 49 <Button 50 android:id="@+id/clear" 51 android:layout_width="wrap_content" 52 android:layout_height="wrap_content" 53 android:text="CLEAR" /> 54</LinearLayout>

DatabaseHelper.java

java

1import android.content.*; 2import android.database.sqlite.*; 3 4import androidx.annotation.Nullable; 5 6public class DatabaseHelper extends SQLiteOpenHelper { 7 public DatabaseHelper(@Nullable Context context) { 8 super(context, "Sample.db", null, 1); 9 } 10 11 @Override 12 public void onCreate(SQLiteDatabase db) { 13 db.execSQL("CREATE TABLE site (id INTEGER PRIMARY KEY, num INTEGER, flg INTEGER)"); 14 15 //初期データ 16 for(int num=1; num<=9; num++) { 17 ContentValues values = new ContentValues(); 18 values.put("num", num); 19 values.put("flg", 0); 20 db.insert("site", "", values); 21 } 22 } 23 24 @Override 25 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 26 db.execSQL("DROP TABLE IF EXISTS site"); 27 onCreate(db); 28 } 29}

投稿2022/11/19 11:10

編集2022/11/20 06:24
jimbe

総合スコア10817

spoofy_dragon, moganite😄を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

moganite

2022/11/20 07:54

何から何までありがとうございました。 androidアプリ開発初心者だったもので、処理の流れもいまいちわからない状態のまま続けていましたが、気になっていたところが晴れてすっきりしました。また、簡潔なプログラムの書き方を学びさせていただきました。 jimbeさんのプログラムを参考に、アプリをよりよくしていこうと思います。
moganite

2022/11/20 11:04

SQLiteDatabase db = helper.getReadableDatabase(); //クローズしない try(Cursor cursor = db.rawQuery("SELECT num,flg FROM site", null)) { //クローズする int numIndex = cursor.getColumnIndex("num"); int flgIndex = cursor.getColumnIndex("flg"); while(cursor.moveToNext()) { int num = cursor.getInt(numIndex); int flg = cursor.getInt(flgIndex); if(1 <= num && num <= buttons.length) setFlgTo(buttons[num-1], flg == 0); } ここはなんの処理をしているのでしょうか
jimbe

2022/11/20 19:01

データベースの全件を読み、ボタンに反映しています。
moganite

2022/11/22 00:49

なるほど!ありがとうございます。

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。