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

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

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

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

Android Studio

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

Q&A

解決済

1回答

1299閲覧

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

moganite

総合スコア1

Java

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

Android Studio

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

0グッド

0クリップ

投稿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を使用しています。 ここにより詳細な情報を記載してください。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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 です。
guest

回答1

0

ベストアンサー

質問自体には"質問へのコメント"で 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

総合スコア12632

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問