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

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

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

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

button

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

保存

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

Android Studio

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

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

5000閲覧

AndroidStudioで時間割表を作りたい

default-nuko

総合スコア3

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

button

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

保存

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

Android Studio

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

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2020/10/23 03:41

編集2020/10/29 03:41

AndroidStudioで時間割表を作成したいと思い、開発を始めました。
時間割表の画像を貼り付け、その上にボタンを配置しています。ボタンを押すと画面遷移して科目登録の画面へ行きます。
科目登録の画面では、科目名、受講部屋、担当教員を入力します。登録ボタンを押すと、時間割表の画面へ遷移します。
登録ボタンを押して時間割表の画面へ遷移した場合、入力された内容は保存されます。科目登録の画面に左上にある✖ボタンを押した時は内容を保存せずに時間割表の画面へ遷移します。時間割表のボタンには科目登録の「科目名」の内容を反映させてあります。

画像では、2つしかボタンが配置されていませんが、各曜日に4つずつの合計20個のボタンを配置する予定です。

1つボタンを作って試した際はうまくいったのですが、2つ目のボタン(buttonと書かれたボタン)を配置して試したところ、1つ目のボタンの内容が変更されてしまいました。このまま続けると、20個配置してもすべて1つ目のボタンが変更されてしまうと思い、今回こちらの掲示板に質問することに決めました。
まずは、現状を知ってもらうために各コードとレイアウトの画像を貼っておきます。
----------------メイン画面(時間割表の画面)の処理------------------------

Kotlin

1 2package com.example.timeschedule 3 4import android.app.Activity 5import android.content.Intent 6import androidx.appcompat.app.AppCompatActivity 7import android.os.Bundle 8import android.view.View 9import kotlinx.android.synthetic.main.activity_main.* 10 11class MainActivity : AppCompatActivity() { 12 13 companion object{ 14 const val REQUEST_CODE = 1000//REQUEST_CODEの値はいくつでもよい。 15 // onActivityResult()に戻ってきたときに、どのActivityから戻ってきたのかを判別する。 16 // 今回のように遷移先が1つしかない場合、値は何でもよい。 17 } 18 19 override fun onCreate(savedInstanceState: Bundle?) { 20 21 22 super.onCreate(savedInstanceState) 23 setContentView(R.layout.activity_main) 24 25 mon_12button.setOnClickListener { 26 val intent = Intent(this, addSubject::class.java) 27 startActivityForResult(intent, REQUEST_CODE) 28 29 } 30 mon_12button2.setOnClickListener { 31 intent = Intent(this,addSubject::class.java) 32 startActivityForResult(intent, REQUEST_CODE) 33 } 34 35 } 36 37 override fun onStart() { 38 super.onStart() 39 val lesson = LessonData(this)//mainで読み込めばアプリを閉じて、再び開いても保存されたまま? 40 val name = lesson.name 41 mon_12button.text = name 42 } 43 44 //結果を受け取るメソッド 45 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { 46 super.onActivityResult(requestCode, resultCode, data) 47 48 if(requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK){ 49 //RESURT_OKで帰ってきたとき、ボタンのテキストを更新 50 mon_12button.text = data?.getStringExtra("TEXT_KEY") 51 } 52 } 53}

----------------科目登録の画面側の処理----------------------------------

Kotlin

1 2package com.example.timeschedule 3 4import android.app.Activity 5import android.content.Intent 6import androidx.appcompat.app.AppCompatActivity 7import android.os.Bundle 8import androidx.core.content.edit 9import androidx.preference.PreferenceManager 10import kotlinx.android.synthetic.main.activity_add_subject.* 11import java.io.Serializable 12 13 14class addSubject : AppCompatActivity() { 15 16 override fun onCreate(savedInstanceState: Bundle?) { 17 super.onCreate(savedInstanceState) 18 19 setContentView(R.layout.activity_add_subject) 20 backButton.setOnClickListener { 21 finish() 22 } 23 24 addButton.setOnClickListener { 25 val intent = Intent() 26 intent.putExtra("TEXT_KEY",subjectName.text.toString())//戻す情報をintentにセット 27 setResult(Activity.RESULT_OK,intent)//結果のコードとibtentをセット 28 29 val lesson = LessonData(this)//登録ボタンを押した際、内容をLessonDataに書き込む 30 lesson.name = subjectName.text.toString() 31 lesson.teacher = responsibleTeacher.text.toString() 32 lesson.room = lectureRoom.text.toString() 33 finish() 34 35 } 36 37 } 38 39 override fun onStart() { 40 super.onStart() 41 val lesson = LessonData(this)//前回保存したデータを読み込む 42 val name = lesson.name 43 val teacher = lesson.teacher 44 val room = lesson.room 45 subjectName.setText(name) 46 lectureRoom.setText(room) 47 responsibleTeacher.setText(teacher) 48 49 } 50 51}

----------------科目登録の画面用のデータセット--------------------------

Kotlin

1package com.example.timeschedule 2 3import android.content.Context 4import androidx.preference.PreferenceManager 5 6class LessonData(context: Context) { 7 private val prefs = PreferenceManager.getDefaultSharedPreferences(context) 8 9 var name: String?//科目名 10 get() = prefs.getString("NAME", null) 11 set(value) = prefs.edit().putString("NAME", value).apply() 12 13 var teacher: String?//教師名 14 get() = prefs.getString("TEACHER", null) 15 set(value) = prefs.edit().putString("TEACHER", value).apply() 16 17 var room: String?//部屋番号 18 get() = prefs.getString("ROOM", null) 19 set(value) = prefs.edit().putString("ROOM", value).apply() 20} 21

イメージ説明
//時間割表の画面
イメージ説明
//科目登録の画面

最終目標は各ボタンを押して科目登録の画面へ遷移し、登録ボタンを押した後押したボタンの内容が変更されるようにすることです。
科目登録の画面は1つで行っていますが,各ボタン用に科目登録の画面やデータセットを追加していかなければいけないのでしょうか?

解決方法が全く分からないので、解決方法や修正箇所,追加するプログラム等ありましたら、教えていただきたいです。

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

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

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

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

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

keicha_hrs

2020/10/24 14:51

コードを画像で提示するのはやめてください。コードを検証するにも画像を開かなければなりませんし、再現試験するためには画像を見ながらコードを打ち直さなくてはなりません。その手間を強いられる質問は回答者からも回答を避けられてしまいます。KotlinのコードやレイアウトのXMLはテキストで提示しましょう。
default-nuko

2020/10/26 02:55

ご指摘ありがとうございます。 画像掲示からテキスト掲示に変更ししてみました。
keicha_hrs

2020/10/27 14:33

まずはテキストでのご提示、ありがとうございます。ただ、コードの提示には専用の修飾のためのMarkdown記述があります。入力フォーム上で<code>というボタンを押すと、 ```ここに言語を入力 コード ``` と出力されるはずですが、この```に挟むようにコードを記述し、「ここに言語を入力」の部分に言語名(今回ならkotlin)を記述するようにしてください。
default-nuko

2020/10/29 03:43

ご指摘ありがとうございます。 Markdown記述で修正しました
guest

回答1

0

ベストアンサー

1つボタンを作って試した際はうまくいったのですが、2つ目のボタン(buttonと書かれたボタン)を配置して試したところ、1つ目のボタンの内容が変更されてしまいました。

これについては、onActivityResult()に戻ってきたときに、ボタンのテキストを書き換えるコードが1つのボタン分しか記述されていません。これでは常に同じボタンのテキストしか更新されないのは当然です。どのボタンを押してaddSubjectに移行し、戻ってきたのかを識別し、そのボタンのテキストを書き換えるようにする必要があります。いろいろ方法はあるでしょうが、REQUEST_CODEを利用するのも一つの方法になるのではないでしょうか。

kotlin

1 mon_12button.setOnClickListener { 2 val intent = Intent(this, addSubject::class.java) 3 startActivityForResult(intent, REQUEST_CODE) 4 5 } 6 mon_12button2.setOnClickListener { 7 intent = Intent(this,addSubject::class.java) 8 startActivityForResult(intent, REQUEST_CODE + 1) 9 }

のようにすれば、onActivityResult()に戻ってきたとき、mon_12button2によって移行したものが戻ってきたことがわかります。

それから、データを保存する仕組みについてですが、これは以前私が回答したものですね。この仕組みのままだと、1組分の情報しか保存できず、20組分の情報を保存することができません。この改良も考えなくてはなりません。SharedPreferencesを用いた方法のままで改良するのであれば、JSON形式で保存するのも一つの方法でしょう。android json sharedpreferencesといったキーワードでGoogle検索すれば資料が数多く見つかります。

或いは、もっと単純に要素(科目、教師、部屋番号)ごとにカンマなどで区切って20個連ねて保存する方法もあるでしょう。文字列を特定の文字で分解して配列として取り出す手法もネットで見つけられるはずなので、そうした方法を考えてみてもいいと思います。

投稿2020/10/28 13:18

keicha_hrs

総合スコア6768

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

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

default-nuko

2020/10/30 03:35

ありがとうございます。 早速試してみようと思います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問