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

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

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

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Kotlin

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

Q&A

0回答

244閲覧

カスタムレイアウトクラスからほかのカスタムレイアウトクラスに干渉する方法

Shibou

総合スコア15

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Kotlin

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

0グッド

0クリップ

投稿2020/06/21 07:36

画面上半分に表示されているCalendarの日付を変更したときに、
画面下半分に表示されているScrollのリストを変更したいのですが、
どうやって変更するのかがわかりません。

下記コードのCalendarクラスのupdateTextViewメソッドの
ClickListener設定時にPlanDoクラスのmakeRecyclerViewListメソッドを
呼び出せるようにできればよいのですが、どうやってもうまくいきません。
解決策をご教授いただければ幸いです。

kotlin

1class Calendar constructor( 2 context: Context, 3 attrs: AttributeSet 4) : ConstraintLayout(context,attrs){ 5 6 //カレンダー作成用のクラス 7 private var calendarMaker: CalendarMaker 8 9 //TextViewのIDが入った配列(6行7列) 10 private var dateViews : MutableList<MutableList<TextView>> 11 12 //選択している日付 13 var choose: TextView? = null 14 15 //今日の年月 16 var nowYearMonth: String? = null 17 18 //今日の日付 19 var today : Int = 0 20 21 init { 22 //calendarカスタムレイアウトを取得する 23 LayoutInflater.from(context).inflate(R.layout.calendar,this) 24 //TableLayoutのTextViewを取得する 25 dateViews = mutableListOf( 26 mutableListOf(one_one,one_two,one_three,one_four,one_five,one_six,one_seven), 27 mutableListOf(two_one,two_two,two_three,two_four,two_five,two_six,two_seven), 28 mutableListOf(three_one,three_two,three_three,three_four,three_five,three_six,three_seven), 29 mutableListOf(four_one,four_two,four_three,four_four,four_five,four_six,four_seven), 30 mutableListOf(five_one,five_two,five_three,five_four,five_five,five_six,five_seven), 31 mutableListOf(six_one,six_two,six_three,six_four,six_five,six_six,six_seven) 32 ) 33 //Calendar作成用クラスを取得 34 calendarMaker = CalendarMaker() 35 //title文字列の変更 36 year_month.text = calendarMaker.getDisplay() 37 38 //今日の年月の記録 39 nowYearMonth = year_month.text.toString() 40 //今日の日付の記録 41 today = calendarMaker.nowDay 42 43 //日付を更新 44 updateTextView() 45 } 46 //日付TextViewの更新 47 private fun updateTextView(){ 48 //表示月の日付が格納されたListを取得する 49 val dateList = calendarMaker.getList() 50 //dateListから何番目の文字列を取り出すか 51 var dateCount = 0 52 //日付TextViewにClickListenerを設定する 53 for(row in dateViews){ 54 for (date in row){ 55 //背景をリセットする 56 date.setBackgroundColor(Color.WHITE) 57 58 date.text = dateList[dateCount] 59 //日付が入らなかった場合 60 if(date.text.toString() == ""){ 61 date.isClickable = false 62 //6行目の日曜日が空欄だった場合 63 if(date == six_one){ 64 //6行目を不可視化 65 lastWeek.visibility = View.GONE 66 //ループ終了 67 break 68 }else{ 69 lastWeek.visibility = View.VISIBLE 70 } 71 }//日付入りの場合 72 else{ 73 //ClickListenerを登録する 74 date.setOnClickListener{ 75 //日付の選択がされていた場合 76 if(choose != null){ 77 //選択されていたのが今日の日付の場合 78 if(todayOrElse(choose!!)){ 79 //今日の日付用の背景に戻す 80 choose!!.setBackgroundResource(R.drawable.today) 81 }else{ 82 //今日以外の日付用の背景に戻す 83 choose!!.setBackgroundColor(Color.WHITE) 84 } 85 } 86 //選択した日付を記録する 87 choose = it as TextView 88 //新しい日付を格納する 89 HaveData.setStringAndBoolean(nowYearMonth+choose!!.text.toString(),true) 90 91 //今日の日付がクリックされた場合 92 if (todayOrElse(choose!!)){ 93 //背景を変更する 94 it.setBackgroundResource(R.drawable.today_and_choose_day) 95 }else{ 96 //背景を変更する 97 it.setBackgroundResource(R.drawable.choose_day) 98 } 99 }//end ClickListener 100 //今日の日付の場合(背景を今日の日付用のものに変える) 101 if (todayOrElse(date)) date.setBackgroundResource(R.drawable.today) 102 } 103 //カウントを1追加 104 dateCount++ 105 } 106 } 107 } 108 //今日の日付のTextViewかどうか 109 private fun todayOrElse(date: TextView): Boolean{ 110 if(today.toString() == date.text.toString() && 111 nowYearMonth == year_month.text.toString()){ 112 return true 113 } 114 return false 115 } 116 //月を一つ前にする 117 fun previous(){ 118 //選択日をリセット 119 choose = null 120 //CalendarMakerを前の月に更新 121 calendarMaker.previous() 122 //タイトルの更新 123 year_month.text = calendarMaker.getDisplay() 124 //TextViewの更新 125 updateTextView() 126 //データ登録不可に 127 HaveData.setCanOpen(false) 128 } 129 //月を一つ進める 130 fun nextMonth(){ 131 //選択日をリセット 132 choose = null 133 //CalendarMakerを次の月に更新 134 calendarMaker.nextMonth() 135 //タイトルの更新 136 year_month.text = calendarMaker.getDisplay() 137 //TextViewの更新 138 updateTextView() 139 //データ登録不可に 140 HaveData.setCanOpen(false) 141 } 142 143}

kotlin

1class PlanDo constructor( 2 context: Context, 3 attrs: AttributeSet 4) : CoordinatorLayout(context,attrs) { 5 //選択されたメニュー(起動時は予定メニューを選択している) 6 var menu = R.string.planning 7 8 //プライマリイーコンストラクタ 9 init { 10 //カスタムレイアウトplan_doを取得して拡張する 11 LayoutInflater.from(context).inflate(R.layout.plan_do,this) 12 //起動時は予定メニューを選択する 13 onPlanning() 14 } 15 //日報ボタンがクリックされたときの処理 16 fun onDoPlanning(){ 17 //日報メニューが選択された 18 menu = R.string.do_planning 19 //背景を日報用に変更する 20 recycler_scroll.setBackgroundResource(R.drawable.do_planning_back) 21 //FloatingActionButtonの背景色を変換 22 floating_action_button.backgroundTintList = ColorStateList.valueOf(R.drawable.do_planning_back) 23 //RecyclerViewを更新 24 makeRecyclerViewList() 25 } 26 //予定ボタンがクリックされたときの処理 27 fun onPlanning(){ 28 //予定メニューが選択された 29 menu = R.string.planning 30 //背景を予定用に変更する 31 recycler_scroll.setBackgroundResource(R.drawable.planning_back) 32 //FloatingActionButtonの背景色を変換 33 floating_action_button.backgroundTintList = ColorStateList.valueOf(R.drawable.planning_back) 34 //RecyclerViewを更新 35 makeRecyclerViewList() 36 } 37 //会計ボタンがクリックされたときの処理 38 fun onAccounting(){ 39 //会計メニューが選択された 40 menu = R.string.accounting 41 //背景を会計用に変更する 42 recycler_scroll.setBackgroundResource(R.drawable.accounting_back) 43 //FloatingActionButtonの背景色を変換 44 floating_action_button.backgroundTintList = ColorStateList.valueOf(R.drawable.accounting_back) 45 //RecyclerViewを更新 46 makeRecyclerViewList() 47 } 48 //RecyclerViewのホルダークラス 49 private inner class RecyclerListViewHolder(view: View) : RecyclerView.ViewHolder(view) { 50 //メモの登録時刻を表示するTextView 51 var timeOrMoney: TextView 52 //リストの1行分のメモを表示するTextView 53 var memoText: TextView 54 //プライマリーコンストラクタ 55 init { 56 //引数で渡されたリスト一行分の画面部品中から表示に使われるTextViewを取得 57 timeOrMoney = itemView.findViewById(R.id.time_or_money) 58 memoText = itemView.findViewById(R.id.memo) 59 } 60 } 61 //RecyclerViewのアダプタクラスを生成する 62 private inner class RecyclerListAdapter(private val _listData: List<MutableMap<String,Any>>) 63 : RecyclerView.Adapter<RecyclerListViewHolder>(){ 64 //ViewHolderの生成 65 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerListViewHolder { 66 //レイアウトインフレータの取得 67 val inflater = LayoutInflater.from(MainActivity.instance) 68 //plan_scroll_rowをインフレーとして、一行分の画面部品とする 69 val view = inflater.inflate(R.layout.plan_scroll_row,parent,false) 70 //ビューホルダーオブジェクトを生成 71 val holder = RecyclerListViewHolder(view) 72 //生成したViewHolderをリターン 73 return holder 74 } 75 76 override fun onBindViewHolder(holder: RecyclerListViewHolder, position: Int) { 77 //リストデータから該当一行分のデータを取得する 78 val item = _listData[position] 79 //メモ文字列を取得 80 val memo = item["memo"] as String 81 //登録時間か支出金額を取得 82 val money = item["money"] as Int 83 //メモの内容と登録時間か、支出金額をホルダー中のTextViewに設定する 84 if(money == 0){ 85 val time = item["time"] as String 86 holder.timeOrMoney.text = time 87 }else{ 88 holder.timeOrMoney.text = money.toString() 89 } 90 //メモの内容を登録する 91 holder.memoText.text = memo 92 } 93 94 override fun getItemCount(): Int { 95 //リストデータ中の件数を返す 96 return _listData.size 97 } 98 } 99 fun makeRecyclerViewList() { 100 //データベースを開いてリストの取得ができる場合 101 if(HaveData.open_database && HaveData.year_month_day != null){ 102 //RecyclerViewを取得する 103 val recyclerView = recycler_scroll 104 //LinearLayoutManagerオブジェクトを生成 105 val layout = LinearLayoutManager(MainActivity.instance) 106 //RecyclerViewにレイアウトマネージャーとして登録 107 recyclerView.layoutManager = layout 108 //データベースの取得 109 val database = Database(MainActivity.instance,Database.DATABASE_NAME, 110 null,Database.DATABASE_VERSION) 111 //リストデータを取得する 112 val listData = database.getMemo( 113 HaveData.year_month_day!!,resources.getString(menu) 114 ) 115 database.close() 116 //アダプタオブジェクトを生成 117 val adapter = RecyclerListAdapter(listData) 118 //RecyclerViewにアダプタオブジェクトを設定 119 recyclerView.adapter = adapter 120 } 121 } 122}

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

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

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

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

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

kakajika

2020/06/21 09:01

レイアウト間でデータのやり取りをしたいということですか?FragmentやActivityを利用しないのはなにか理由があるのでしょうか?
Shibou

2020/06/21 09:27

ここまで作った状況からFragmentやActivityを利用して作り変える方法がわからないのです...
hoshi-takanori

2020/06/21 10:11 編集

別にカスタムビューのままでもいいと思いますが、ビュー同士が直接やり取りすると収拾がつかなくなるので、Calendar クラスに onDateChanged みたいなメソッドを持ったインターフェイスを定義して、Calendar と PlanDo を配置した Activity か Fragment で Listener を登録するのが一般的なやり方ですね。
Shibou

2020/06/21 11:08

やはりそうですよね...。 新しいプロジェクトを作って、コピペと適宜修正で作り直します。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問