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

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

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

HTMLの<input type="text">で生成されるtextboxに関するタグです。

checkbox

checkboxは、GUIのエレメントです。また、HTML<input>タグのtype属性で扱われる値を指します。

button

HTMLで用いる<button>タグです。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Android Studio

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

Q&A

解決済

1回答

1017閲覧

チェックboxの有り/無しでテキストとボタンの有効/無効を操作しチェック状態も保存したい。

rockey_7625

総合スコア25

textbox

HTMLの<input type="text">で生成されるtextboxに関するタグです。

checkbox

checkboxは、GUIのエレメントです。また、HTML<input>タグのtype属性で扱われる値を指します。

button

HTMLで用いる<button>タグです。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Android Studio

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

0グッド

0クリップ

投稿2020/08/22 07:14

編集2020/08/22 12:21

簡単なスケジュールメモを作成しており
チェックboxの有り/無しでテキストとボタンの有効/無効を操作しチェック状態も保存したいのですが
コードは完成させたのですがうまい事動きません。。。。
詳細仕様は以下です。
・)textedit2つに予定内容、予定日時を入力し保存ボタンで入力状態を保存する。
※checkboxのcheckが無しだとtexteditへの入力/保存ボタン・クリアボタンの操作は無効。
※checkboxにcheckが入っていればtexteditへの入力/保存ボタン・クリアボタンの操作は有効。
・)保存ボタンでtexteditの内容/check状態を保存し、次回アプリ起動時には読みだして表示する。
エラーは出ていないのでコードの内容におかしい箇所があると思うのですが、どう修正すればいいか悩んでおります。。。。宜しければアドバイス頂きたいです。

final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); final boolean checked = prefs.getBoolean("chkbox01",false); final String schetext = prefs.getString("schetext", ""); final String schetime = prefs.getString("schetime", ""); final CheckBox chkbox01 = (CheckBox)findViewById(R.id.checkbox01); chkbox01.setChecked(checked); //読み込んだ値に応じて文字列の初期状態をセット if (!checked){ chkbox01.setText("予定:No.01を入力する場合はチェックして下さい。"); EditText scheedit01 = findViewById(R.id.schedule_text01); scheedit01.setEnabled(false); // チェック無しのケースは入力禁止 EditText schetime01 = findViewById(R.id.schedule_time01); schetime01.setEnabled(false);//チェック無しの場合は予定時間も入力禁止 Button button1 = (Button)findViewById(R.id.button1); button1.setEnabled(false);//チェック無しの場合はボタンも使用できない Button button2 = (Button)findViewById(R.id.button2); button2.setEnabled(false);//チェック無しの場合はボタンも使用できない }else { chkbox01.setText("予定:No.01が入力されています。"); TextView sche01 = findViewById(R.id.schedule01); sche01.setText("Schedule No.01"); EditText scheedit01 = findViewById(R.id.schedule_text01); scheedit01.setText(schetext); EditText schetime01 = findViewById(R.id.schedule_time01); schetime01.setText(schetime); } chkbox01.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //チェック状態を取得する final boolean checked = chkbox01.isChecked(); final EditText scheedit01 = findViewById(R.id.schedule_text01); scheedit01.setEnabled(true); // チェックが有りなら入力を許可する scheedit01.setText(schetext); final EditText schetime01 = findViewById(R.id.schedule_time01); schetime01.setEnabled(true);//チェックが有りなら入力を許可する。 schetime01.setText(schetime); Button button1 = (Button)findViewById(R.id.button1); button1.setEnabled(true);//チェック有ならボタン使用を許可 Button button2 = (Button)findViewById(R.id.button2); button2.setEnabled(true);//チェック有ならボタン使用を許可 //予定クリアボタンで入力内容をクリアする button2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { scheedit01.getEditableText().clear(); schetime01.getEditableText().clear(); } }); button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //予定内容/予定日時のテキストを取得 String savetext = scheedit01.getText().toString(); String savetime = schetime01.getText().toString(); //SharedPreferencesに書き込む SharedPreferences.Editor editor = prefs.edit(); editor.putBoolean("chkbox01", checked); editor.putString("schetext", savetext); editor.putString("schetime", savetime); //editor.commit() editor.apply(); } }); if(!checked) { chkbox01.setText("予定:No.01を入力する場合はチェックして下さい。"); } else{ chkbox01.setText("予定:No.01が入力されています。"); } } });

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

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

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

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

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

keicha_hrs

2020/08/22 09:39

前の質問でも指摘されているはずですが、コードの範囲にはMarkdownを用いてください。
rockey_7625

2020/08/22 12:28

先ほど修正を行いました。 コード貼り付けになれておらず、申し訳ありません。 投稿の際にコードの挿入の機能に気付いていませんでした。。 機能を使えばMarkdown記法で貼り付け可能なようですので今後機能を使用して貼り付けるように致します。※Markdown記法に関して初心者で申し訳ありません。
keicha_hrs

2020/08/22 12:35

それと、質問内容からは「うまくいっていないこと」が何なのかよくわかりません。「チェック状態も保存したい」というのがうまくいっていないことですか?
rockey_7625

2020/08/22 12:56

うまくいっていない事は以下です。 ①チェック状態の保存は想定通りの動きですが、texteditの書き込みを行い保存ボタンで保存しアプリ終了→アプリを再度起動した時にクリアボタンが機能しない。【チェック有りなのにクリアボタンが効かない。。。】 ②再度アプリを起動した時にチェックをはずしても保存/クリアボタンが有効になってしまう。 【チェック無しでは無効にしたつもりなのですが。。。】
keicha_hrs

2020/08/22 13:31

「アプリを再起動」というのは、例えばホームボタンを押してランチャー画面に戻った後に、ランチャーからアプリアイコンを叩く操作を含んでいますか?その場合、onCreate()は実行されないので、別の対応をする必要があります。
rockey_7625

2020/08/22 13:36

はい、一旦アプリを終了させてホーム画面に戻り再度アプリアイコンを叩いて起動させますので含んでいます。現状のコードでは不十分という事でしょうか?
keicha_hrs

2020/08/22 14:02 編集

チェックボックスの状態を保存したいのは、チェックをON/OFFしたときですか?それともbutton1を押したときのみですか?
rockey_7625

2020/08/22 14:21

はい、チェックboxの状態保存はbutton1を押したときのみでよいです。
guest

回答1

0

ベストアンサー

findViewById()を何度も繰り返しているところをまとめたり、同じ処理をするところを関数化したりしてまとめてみましたが、これで想定通りの動きになっているでしょうか?違うところがあればまた調整します。

java

1public class MainActivity extends AppCompatActivity { 2 private CheckBox chkbox01; 3 private EditText scheedit01; 4 private EditText schetime01; 5 private Button button1; 6 private Button button2; 7 private TextView sche01; 8 9 @Override 10 protected void onCreate(Bundle savedInstanceState) { 11 super.onCreate(savedInstanceState); 12 setContentView(R.layout.activity_main); 13 14 final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 15 final boolean checked = prefs.getBoolean("chkbox01", false); 16 final String schetext = prefs.getString("schetext", ""); 17 final String schetime = prefs.getString("schetime", ""); 18 19 chkbox01 = findViewById(R.id.checkbox01); 20 scheedit01 = findViewById(R.id.schedule_text01); 21 schetime01 = findViewById(R.id.schedule_time01); 22 button1 = findViewById(R.id.button1); 23 button2 = findViewById(R.id.button2); 24 sche01 = findViewById(R.id.schedule01); 25 26 chkbox01.setChecked(checked); 27 28 viewEnable(checked); 29 30 //読み込んだ値に応じて文字列の初期状態をセット 31 if (checked) { 32 sche01.setText("Schedule No.01"); 33 scheedit01.setText(schetext); 34 schetime01.setText(schetime); 35 } 36 37 chkbox01.setOnClickListener(new View.OnClickListener() { 38 @Override 39 public void onClick(View view) { 40 //チェック状態を取得する 41 boolean checked = chkbox01.isChecked(); 42 viewEnable(checked); 43 } 44 }); 45 46 button1.setOnClickListener(new View.OnClickListener() { 47 @Override 48 public void onClick(View view) { 49 //予定内容/予定日時のテキストを取得 50 boolean checked = chkbox01.isChecked(); 51 String savetext = scheedit01.getText().toString(); 52 String savetime = schetime01.getText().toString(); 53 //SharedPreferencesに書き込む 54 SharedPreferences.Editor editor = prefs.edit(); 55 editor.putBoolean("chkbox01", checked); 56 editor.putString("schetext", savetext); 57 editor.putString("schetime", savetime); 58 //editor.commit() 59 editor.apply(); 60 } 61 }); 62 63 //予定クリアボタンで入力内容をクリアする 64 button2.setOnClickListener(new View.OnClickListener() { 65 @Override 66 public void onClick(View view) { 67 scheedit01.getEditableText().clear(); 68 schetime01.getEditableText().clear(); 69 } 70 }); 71 } 72 73 void viewEnable(boolean checked) { 74 if (!checked) { 75 chkbox01.setText("予定:No.01を入力する場合はチェックして下さい。"); 76 scheedit01.setEnabled(false); // チェック無しのケースは入力禁止 77 schetime01.setEnabled(false);//チェック無しの場合は予定時間も入力禁止 78 button1.setEnabled(false);//チェック無しの場合はボタンも使用できない 79 button2.setEnabled(false);//チェック無しの場合はボタンも使用できない 80 } else { 81 chkbox01.setText("予定:No.01が入力されています。"); 82 scheedit01.setEnabled(true); // チェックが有りなら入力を許可する 83 schetime01.setEnabled(true);//チェックが有りなら入力を許可する。 84 button1.setEnabled(true);//チェック有ならボタン使用を許可 85 button2.setEnabled(true);//チェック有ならボタン使用を許可 86 } 87 } 88}

投稿2020/08/22 14:44

keicha_hrs

総合スコア6768

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

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

rockey_7625

2020/08/22 16:09

先ほど確認しました。 ありがとうございます!この動きがほしかったです! それと自分が書いたコードはかなり無駄が多かったようですね。。。【javaをもっと勉強します。】 また、申し訳ないのですがもう1点質問よろしいでしょか? 今回のコードがおおまか1件分のプログラムになるので、これをもう数件分【5件ぐらい】実装する予定です。 なのでこの一連のコードを配列化して5件分入力/表示したいのですがこれは可能なのでしょうか?
keicha_hrs

2020/08/23 07:13

今回作った画面を2画面目として、1画面目として5件分をリストアップする画面を作ればいいのではないでしょうか。1画面目で選択した番号をインテントで2画面目に送り、2画面目ではそれを受け取ってそれに基づいてSharedPreferencesのキー名を決めたり、表示する文字列の文言を変えたりする工夫を盛り込めばいいと思います。
rockey_7625

2020/08/23 15:03

なるほど! そういう工夫が必要なのですね。 アドバイス誠にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問