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

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

ただいまの
回答率

87.79%

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

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 354

score 15

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

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

class Calendar constructor(
    context: Context,
    attrs: AttributeSet
) : ConstraintLayout(context,attrs){

    //カレンダー作成用のクラス
    private var calendarMaker: CalendarMaker

    //TextViewのIDが入った配列(6行7列)
    private var dateViews : MutableList<MutableList<TextView>>

    //選択している日付
    var choose: TextView? = null

    //今日の年月
    var nowYearMonth: String? = null

    //今日の日付
    var today : Int = 0

    init {
        //calendarカスタムレイアウトを取得する
        LayoutInflater.from(context).inflate(R.layout.calendar,this)
        //TableLayoutのTextViewを取得する
        dateViews = mutableListOf(
            mutableListOf(one_one,one_two,one_three,one_four,one_five,one_six,one_seven),
            mutableListOf(two_one,two_two,two_three,two_four,two_five,two_six,two_seven),
            mutableListOf(three_one,three_two,three_three,three_four,three_five,three_six,three_seven),
            mutableListOf(four_one,four_two,four_three,four_four,four_five,four_six,four_seven),
            mutableListOf(five_one,five_two,five_three,five_four,five_five,five_six,five_seven),
            mutableListOf(six_one,six_two,six_three,six_four,six_five,six_six,six_seven)
        )
        //Calendar作成用クラスを取得
        calendarMaker = CalendarMaker()
        //title文字列の変更
        year_month.text = calendarMaker.getDisplay()

        //今日の年月の記録
        nowYearMonth = year_month.text.toString()
        //今日の日付の記録
        today = calendarMaker.nowDay

        //日付を更新
        updateTextView()
    }
    //日付TextViewの更新
    private fun updateTextView(){
        //表示月の日付が格納されたListを取得する
        val dateList = calendarMaker.getList()
        //dateListから何番目の文字列を取り出すか
        var dateCount = 0
        //日付TextViewにClickListenerを設定する
        for(row in dateViews){
            for (date in row){
                //背景をリセットする
                date.setBackgroundColor(Color.WHITE)

                date.text = dateList[dateCount]
                //日付が入らなかった場合
                if(date.text.toString() == ""){
                    date.isClickable = false
                    //6行目の日曜日が空欄だった場合
                    if(date == six_one){
                        //6行目を不可視化
                        lastWeek.visibility = View.GONE
                        //ループ終了
                        break
                    }else{
                        lastWeek.visibility = View.VISIBLE
                    }
                }//日付入りの場合
                else{
                    //ClickListenerを登録する
                    date.setOnClickListener{
                        //日付の選択がされていた場合
                        if(choose != null){
                            //選択されていたのが今日の日付の場合
                            if(todayOrElse(choose!!)){
                                //今日の日付用の背景に戻す
                                choose!!.setBackgroundResource(R.drawable.today)
                            }else{
                                //今日以外の日付用の背景に戻す
                                choose!!.setBackgroundColor(Color.WHITE)
                            }
                        }
                        //選択した日付を記録する
                        choose = it as TextView
                        //新しい日付を格納する
                        HaveData.setStringAndBoolean(nowYearMonth+choose!!.text.toString(),true)

                        //今日の日付がクリックされた場合
                        if (todayOrElse(choose!!)){
                            //背景を変更する
                            it.setBackgroundResource(R.drawable.today_and_choose_day)
                        }else{
                            //背景を変更する
                            it.setBackgroundResource(R.drawable.choose_day)
                        }
                    }//end ClickListener
                    //今日の日付の場合(背景を今日の日付用のものに変える)
                    if (todayOrElse(date)) date.setBackgroundResource(R.drawable.today)
                }
                //カウントを1追加
                dateCount++
            }
        }
    }
    //今日の日付のTextViewかどうか
    private fun todayOrElse(date: TextView): Boolean{
        if(today.toString() == date.text.toString() &&
            nowYearMonth == year_month.text.toString()){
            return true
        }
        return false
    }
    //月を一つ前にする
    fun previous(){
        //選択日をリセット
        choose = null
        //CalendarMakerを前の月に更新
        calendarMaker.previous()
        //タイトルの更新
        year_month.text = calendarMaker.getDisplay()
        //TextViewの更新
        updateTextView()
        //データ登録不可に
        HaveData.setCanOpen(false)
    }
    //月を一つ進める
    fun nextMonth(){
        //選択日をリセット
        choose = null
        //CalendarMakerを次の月に更新
        calendarMaker.nextMonth()
        //タイトルの更新
        year_month.text = calendarMaker.getDisplay()
        //TextViewの更新
        updateTextView()
        //データ登録不可に
        HaveData.setCanOpen(false)
    }

}
class PlanDo constructor(
    context: Context,
    attrs: AttributeSet
) : CoordinatorLayout(context,attrs) {
    //選択されたメニュー(起動時は予定メニューを選択している)
    var menu = R.string.planning

    //プライマリイーコンストラクタ
    init {
        //カスタムレイアウトplan_doを取得して拡張する
        LayoutInflater.from(context).inflate(R.layout.plan_do,this)
        //起動時は予定メニューを選択する
        onPlanning()
    }
    //日報ボタンがクリックされたときの処理
    fun onDoPlanning(){
        //日報メニューが選択された
        menu = R.string.do_planning
        //背景を日報用に変更する
        recycler_scroll.setBackgroundResource(R.drawable.do_planning_back)
        //FloatingActionButtonの背景色を変換
        floating_action_button.backgroundTintList = ColorStateList.valueOf(R.drawable.do_planning_back)
        //RecyclerViewを更新
        makeRecyclerViewList()
    }
    //予定ボタンがクリックされたときの処理
    fun onPlanning(){
        //予定メニューが選択された
        menu = R.string.planning
        //背景を予定用に変更する
        recycler_scroll.setBackgroundResource(R.drawable.planning_back)
        //FloatingActionButtonの背景色を変換
        floating_action_button.backgroundTintList = ColorStateList.valueOf(R.drawable.planning_back)
        //RecyclerViewを更新
        makeRecyclerViewList()
    }
    //会計ボタンがクリックされたときの処理
    fun onAccounting(){
        //会計メニューが選択された
        menu = R.string.accounting
        //背景を会計用に変更する
        recycler_scroll.setBackgroundResource(R.drawable.accounting_back)
        //FloatingActionButtonの背景色を変換
        floating_action_button.backgroundTintList = ColorStateList.valueOf(R.drawable.accounting_back)
        //RecyclerViewを更新
        makeRecyclerViewList()
    }
    //RecyclerViewのホルダークラス
    private inner class RecyclerListViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        //メモの登録時刻を表示するTextView
        var timeOrMoney: TextView
        //リストの1行分のメモを表示するTextView
        var memoText: TextView
        //プライマリーコンストラクタ
        init {
            //引数で渡されたリスト一行分の画面部品中から表示に使われるTextViewを取得
            timeOrMoney = itemView.findViewById(R.id.time_or_money)
            memoText = itemView.findViewById(R.id.memo)
        }
    }
    //RecyclerViewのアダプタクラスを生成する
    private inner class RecyclerListAdapter(private val _listData: List<MutableMap<String,Any>>)
        : RecyclerView.Adapter<RecyclerListViewHolder>(){
        //ViewHolderの生成
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerListViewHolder {
            //レイアウトインフレータの取得
            val inflater = LayoutInflater.from(MainActivity.instance)
            //plan_scroll_rowをインフレーとして、一行分の画面部品とする
            val view = inflater.inflate(R.layout.plan_scroll_row,parent,false)
            //ビューホルダーオブジェクトを生成
            val holder = RecyclerListViewHolder(view)
            //生成したViewHolderをリターン
            return holder
        }

        override fun onBindViewHolder(holder: RecyclerListViewHolder, position: Int) {
            //リストデータから該当一行分のデータを取得する
            val item = _listData[position]
            //メモ文字列を取得
            val memo = item["memo"] as String
            //登録時間か支出金額を取得
            val money = item["money"] as Int
            //メモの内容と登録時間か、支出金額をホルダー中のTextViewに設定する
            if(money == 0){
                val time = item["time"] as String
                holder.timeOrMoney.text = time
            }else{
                holder.timeOrMoney.text = money.toString()
            }
            //メモの内容を登録する
            holder.memoText.text = memo
        }

        override fun getItemCount(): Int {
            //リストデータ中の件数を返す
            return _listData.size
        }
    }
    fun makeRecyclerViewList()  {
        //データベースを開いてリストの取得ができる場合
        if(HaveData.open_database && HaveData.year_month_day != null){
            //RecyclerViewを取得する
            val recyclerView = recycler_scroll
            //LinearLayoutManagerオブジェクトを生成
            val layout = LinearLayoutManager(MainActivity.instance)
            //RecyclerViewにレイアウトマネージャーとして登録
            recyclerView.layoutManager = layout
            //データベースの取得
            val database = Database(MainActivity.instance,Database.DATABASE_NAME,
                null,Database.DATABASE_VERSION)
            //リストデータを取得する
            val listData = database.getMemo(
                HaveData.year_month_day!!,resources.getString(menu)
            )
            database.close()
            //アダプタオブジェクトを生成
            val adapter = RecyclerListAdapter(listData)
            //RecyclerViewにアダプタオブジェクトを設定
            recyclerView.adapter = adapter
        }
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • kakajika

    2020/06/21 18:01

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

    キャンセル

  • Shibou

    2020/06/21 18:27

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

    キャンセル

  • hoshi-takanori

    2020/06/21 19:09 編集

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

    キャンセル

  • Shibou

    2020/06/21 20:08

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

    キャンセル

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

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

  • ただいまの回答率 87.79%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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