24.12.20
This commit is contained in:
parent
a1162f2f4c
commit
41824758a7
@ -0,0 +1,48 @@
|
|||||||
|
package com.example.calrendarview.Adapter
|
||||||
|
|
||||||
|
import android.os.Build
|
||||||
|
import android.util.Log
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import android.widget.FrameLayout
|
||||||
|
import android.widget.LinearLayout.LayoutParams
|
||||||
|
import androidx.annotation.RequiresApi
|
||||||
|
import androidx.constraintlayout.widget.ConstraintLayout
|
||||||
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import com.example.calrendarview.MonthLayout
|
||||||
|
import com.example.calrendarview.model.CalendarFactory
|
||||||
|
import com.example.calrendarview.model.CalendarPod
|
||||||
|
import java.time.LocalDate
|
||||||
|
|
||||||
|
@RequiresApi(Build.VERSION_CODES.O)
|
||||||
|
class PagerAdapter(
|
||||||
|
private val pods: ArrayList<CalendarPod>,
|
||||||
|
private val idLayout: Int,
|
||||||
|
private val idTextViewNumOfDay: Int
|
||||||
|
): RecyclerView.Adapter<PagerAdapter.ViewHolder>() {
|
||||||
|
inner class ViewHolder(val view: View): RecyclerView.ViewHolder(view)
|
||||||
|
|
||||||
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PagerAdapter.ViewHolder {
|
||||||
|
val container = ConstraintLayout(parent.context).apply {
|
||||||
|
this.layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, ConstraintLayout.LayoutParams.MATCH_PARENT)
|
||||||
|
}
|
||||||
|
return ViewHolder(container)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onBindViewHolder(holder: PagerAdapter.ViewHolder, position: Int) {
|
||||||
|
val container = holder.view as ViewGroup
|
||||||
|
val a = MonthLayout(holder.view.context).apply {
|
||||||
|
this.layoutParams = ConstraintLayout.LayoutParams(LayoutParams.MATCH_PARENT, ConstraintLayout.LayoutParams.MATCH_PARENT)
|
||||||
|
this.idLayout = this@PagerAdapter.idLayout
|
||||||
|
this.idTextViewNumOfDay = this@PagerAdapter.idTextViewNumOfDay
|
||||||
|
this.listOfBean = CalendarFactory().getBeansOfMonth(pods[position])
|
||||||
|
this.targetYear = pods[position].year
|
||||||
|
this.targetMonth = pods[position].month
|
||||||
|
}
|
||||||
|
container.removeAllViews()
|
||||||
|
container.addView(a)
|
||||||
|
Log.d("holder >>>>>","holder ${holder.view.height}, ${holder.view.width}")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getItemCount(): Int = pods.size
|
||||||
|
}
|
||||||
@ -0,0 +1,70 @@
|
|||||||
|
package com.example.calrendarview
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.res.TypedArray
|
||||||
|
import android.util.AttributeSet
|
||||||
|
import android.util.Log
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import android.widget.TextView
|
||||||
|
import androidx.constraintlayout.widget.ConstraintLayout
|
||||||
|
import androidx.core.view.children
|
||||||
|
|
||||||
|
abstract class BaseCustomLayout : ConstraintLayout {
|
||||||
|
constructor(context: Context) : super(context){applyAttrs(context,null)}
|
||||||
|
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs){applyAttrs(context,attrs)}
|
||||||
|
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
|
||||||
|
context,
|
||||||
|
attrs,
|
||||||
|
defStyleAttr
|
||||||
|
){applyAttrs(context,attrs)}
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
context: Context,
|
||||||
|
attrs: AttributeSet?,
|
||||||
|
defStyleAttr: Int,
|
||||||
|
defStyleRes: Int
|
||||||
|
) : super(context, attrs, defStyleAttr, defStyleRes) {applyAttrs(context,attrs)}
|
||||||
|
|
||||||
|
|
||||||
|
protected val tag = this:: class.simpleName
|
||||||
|
// 하루가 표시될 layout id
|
||||||
|
var idLayout : Int = -1
|
||||||
|
// 날짜(num)가 표시될 TextView
|
||||||
|
var textViewNumOfDay : TextView? = null
|
||||||
|
// 날짜(num)가 표시될 TextView 의 id
|
||||||
|
var idTextViewNumOfDay : Int = -1
|
||||||
|
set(value) {
|
||||||
|
field = value
|
||||||
|
Log.e(tag, "idTextViewNumOfDay $field")
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private fun applyAttrs(context: Context?, attrs: AttributeSet?) {
|
||||||
|
context?.let {
|
||||||
|
onTypedArray(it, it.obtainStyledAttributes(attrs, R.styleable.BaseCustomLayout))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
open fun onTypedArray(context: Context, typedArray : TypedArray) {
|
||||||
|
Log.e(tag, "context (${context})")
|
||||||
|
idLayout = typedArray.getResourceId(R.styleable.BaseCustomLayout_item_layout, R.layout.item_day).also {
|
||||||
|
Log.e(tag, "idLayout default (${R.layout.item_day})")
|
||||||
|
Log.e(tag, "idLayout (${idLayout}) Id >>>> ${it}")
|
||||||
|
}
|
||||||
|
idTextViewNumOfDay = typedArray.getResourceId(R.styleable.BaseCustomLayout_numOfDayId, R.id.day_num).also {
|
||||||
|
Log.e(tag, "idTextViewNumOfDay default (${R.id.day_num})")
|
||||||
|
Log.e(tag, "idTextViewNumOfDay (${idTextViewNumOfDay}) Id >>>> ${it}")
|
||||||
|
}
|
||||||
|
initLayout(context)
|
||||||
|
}
|
||||||
|
|
||||||
|
open fun initLayout(context: Context?) {
|
||||||
|
// createdLayout(LayoutInflater.from(context).inflate(idLayout, this, true))
|
||||||
|
}
|
||||||
|
|
||||||
|
open fun createdLayout(view : View) {
|
||||||
|
Log.e(tag,"Created view is $view")
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,54 +0,0 @@
|
|||||||
package com.example.calrendarview
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.content.res.TypedArray
|
|
||||||
import android.util.AttributeSet
|
|
||||||
import android.util.Log
|
|
||||||
import android.view.LayoutInflater
|
|
||||||
import android.view.View
|
|
||||||
import android.view.ViewGroup
|
|
||||||
import androidx.constraintlayout.widget.ConstraintLayout
|
|
||||||
|
|
||||||
abstract class BaseCustomViews : ConstraintLayout {
|
|
||||||
protected val TAG = this:: class.simpleName
|
|
||||||
constructor(context: Context) : super(context){appyAttrs(context,null)}
|
|
||||||
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs){appyAttrs(context,attrs)}
|
|
||||||
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
|
|
||||||
context,
|
|
||||||
attrs,
|
|
||||||
defStyleAttr
|
|
||||||
){appyAttrs(context,attrs)}
|
|
||||||
|
|
||||||
constructor(
|
|
||||||
context: Context,
|
|
||||||
attrs: AttributeSet?,
|
|
||||||
defStyleAttr: Int,
|
|
||||||
defStyleRes: Int
|
|
||||||
) : super(context, attrs, defStyleAttr, defStyleRes) {appyAttrs(context,attrs)}
|
|
||||||
|
|
||||||
var layouId : Int = -1
|
|
||||||
open fun appyAttrs(context: Context?, attrs: AttributeSet?) {
|
|
||||||
context?.let {
|
|
||||||
onTypedArray(it,it.obtainStyledAttributes(attrs, R.styleable.BaseCustomViews))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
open fun onTypedArray(context: Context, typedArray : TypedArray) {
|
|
||||||
layouId = typedArray.getResourceId(R.styleable.BaseCustomViews_item_layout,R.layout.item_day)
|
|
||||||
initLayout(context)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun initLayout(context: Context?) {
|
|
||||||
createdLayout(LayoutInflater.from(context).inflate(layouId, this, true))
|
|
||||||
}
|
|
||||||
|
|
||||||
open fun createdLayout(view : View) {
|
|
||||||
Log.e(this::class.simpleName,"view si $view")
|
|
||||||
}
|
|
||||||
|
|
||||||
// override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
|
|
||||||
// if (changed) {
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
@ -0,0 +1,77 @@
|
|||||||
|
package com.example.calrendarview
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
|
import android.content.Context
|
||||||
|
import android.graphics.Canvas
|
||||||
|
import android.graphics.Color
|
||||||
|
import android.os.Build
|
||||||
|
import android.util.AttributeSet
|
||||||
|
import android.util.Log
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import android.widget.LinearLayout
|
||||||
|
import androidx.annotation.RequiresApi
|
||||||
|
import androidx.constraintlayout.widget.ConstraintLayout
|
||||||
|
import androidx.viewpager2.widget.ViewPager2
|
||||||
|
import com.example.calrendarview.Adapter.PagerAdapter
|
||||||
|
import com.example.calrendarview.model.CalendarBean
|
||||||
|
import com.example.calrendarview.model.CalendarFactory
|
||||||
|
import com.example.calrendarview.model.CalendarPod
|
||||||
|
import java.time.LocalDate
|
||||||
|
|
||||||
|
@RequiresApi(Build.VERSION_CODES.O)
|
||||||
|
class CalendarLayout: BaseCustomLayout {
|
||||||
|
constructor(context: Context) : super(context)
|
||||||
|
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
|
||||||
|
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
|
||||||
|
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) {
|
||||||
|
this.attrs = attrs
|
||||||
|
this.defStyleAttr = defStyleAttr
|
||||||
|
this.defStyleRes = defStyleRes
|
||||||
|
}
|
||||||
|
|
||||||
|
var attrs: AttributeSet? = null
|
||||||
|
var defStyleAttr: Int? = null
|
||||||
|
var defStyleRes: Int? = null
|
||||||
|
private lateinit var pager: ViewPager2
|
||||||
|
private var pods: ArrayList<CalendarPod> = arrayListOf()
|
||||||
|
|
||||||
|
|
||||||
|
// Constraint Layout
|
||||||
|
override fun onAttachedToWindow() {
|
||||||
|
super.onAttachedToWindow()
|
||||||
|
// Create a pager
|
||||||
|
pager = createPager()
|
||||||
|
// Attach a pager
|
||||||
|
this.removeAllViews()
|
||||||
|
this.addView(pager)
|
||||||
|
// Set pager's adapter
|
||||||
|
// Set data
|
||||||
|
setData(LocalDate.now())
|
||||||
|
pager.adapter = PagerAdapter(pods, idLayout, idTextViewNumOfDay)
|
||||||
|
pager.layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
|
||||||
|
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
|
||||||
|
Log.d(tag, "pager width = ${pager.measuredWidth}")
|
||||||
|
Log.d(tag, "pager height = ${pager.measuredHeight}")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun requestLayout() {
|
||||||
|
super.requestLayout()
|
||||||
|
Log.e(tag, "did requestLayout")
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// fun
|
||||||
|
fun createPager(): ViewPager2 = ViewPager2(context).apply {
|
||||||
|
this.layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)
|
||||||
|
orientation = ViewPager2.ORIENTATION_HORIZONTAL
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun setData(date: LocalDate) {
|
||||||
|
pods.add(CalendarPod(2024, 11))
|
||||||
|
pods.add(CalendarPod(LocalDate.now()))
|
||||||
|
pods.add(CalendarPod(2025, 1))
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,76 @@
|
|||||||
|
package com.example.calrendarview
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.res.TypedArray
|
||||||
|
import android.graphics.Canvas
|
||||||
|
import android.util.AttributeSet
|
||||||
|
import android.util.Log
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import android.widget.TextView
|
||||||
|
import androidx.core.view.children
|
||||||
|
import com.example.calrendarview.model.DayInfo
|
||||||
|
|
||||||
|
class DayLayout : BaseCustomLayout {
|
||||||
|
constructor(context: Context) : super(context)
|
||||||
|
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
|
||||||
|
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
|
||||||
|
context,
|
||||||
|
attrs,
|
||||||
|
defStyleAttr
|
||||||
|
)
|
||||||
|
constructor(
|
||||||
|
context: Context,
|
||||||
|
attrs: AttributeSet?,
|
||||||
|
defStyleAttr: Int,
|
||||||
|
defStyleRes: Int
|
||||||
|
) : super(context, attrs, defStyleAttr, defStyleRes)
|
||||||
|
|
||||||
|
|
||||||
|
// data
|
||||||
|
private var infoDay: DayInfo? = null
|
||||||
|
|
||||||
|
|
||||||
|
// Constraint Layout -----------------------------------------
|
||||||
|
// size
|
||||||
|
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
|
||||||
|
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
|
||||||
|
}
|
||||||
|
|
||||||
|
// location
|
||||||
|
override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
|
||||||
|
super.onLayout(changed, left, top, right, bottom)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onDraw(canvas: Canvas) {
|
||||||
|
super.draw(canvas)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun requestLayout() {
|
||||||
|
super.requestLayout()
|
||||||
|
onBindInfo()
|
||||||
|
}
|
||||||
|
// -----------------------------------------------------------
|
||||||
|
|
||||||
|
// BaseCustomLayout ------------------------------------------
|
||||||
|
override fun initLayout(context: Context?) {
|
||||||
|
super.initLayout(context)
|
||||||
|
val view = LayoutInflater.from(context).inflate(idLayout, this, true)
|
||||||
|
(view as? ViewGroup)?.let {
|
||||||
|
it.children.forEach { Log.e(tag,"child is ${it}") }
|
||||||
|
}
|
||||||
|
textViewNumOfDay = findViewById<TextView>(idTextViewNumOfDay).also {
|
||||||
|
Log.e(tag, "textViewNumOfDay $textViewNumOfDay >>> ${it}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// -----------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
private fun onBindInfo() {
|
||||||
|
textViewNumOfDay?.text = infoDay?.getNumOfDay()?.toString() ?: "TEST"
|
||||||
|
Log.e(tag, "textViewNumOfDay >>>> 4 ${textViewNumOfDay}")
|
||||||
|
Log.e(tag, "textViewNumOfDay?.text >>>> 4 ${textViewNumOfDay?.text}")
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,97 +0,0 @@
|
|||||||
package com.example.calrendarview
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.content.res.TypedArray
|
|
||||||
import android.graphics.Canvas
|
|
||||||
import android.graphics.Color
|
|
||||||
import android.util.AttributeSet
|
|
||||||
import android.util.Log
|
|
||||||
import android.view.View
|
|
||||||
import android.view.ViewGroup
|
|
||||||
import android.widget.TextView
|
|
||||||
import androidx.core.view.children
|
|
||||||
import com.example.calrendarview.model.DayInfo
|
|
||||||
|
|
||||||
class DayView : BaseCustomViews {
|
|
||||||
|
|
||||||
constructor(context: Context) : super(context)
|
|
||||||
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
|
|
||||||
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
|
|
||||||
context,
|
|
||||||
attrs,
|
|
||||||
defStyleAttr
|
|
||||||
)
|
|
||||||
|
|
||||||
constructor(
|
|
||||||
context: Context,
|
|
||||||
attrs: AttributeSet?,
|
|
||||||
defStyleAttr: Int,
|
|
||||||
defStyleRes: Int
|
|
||||||
) : super(context, attrs, defStyleAttr, defStyleRes)
|
|
||||||
|
|
||||||
var dayInfo: DayInfo? = null
|
|
||||||
set(value) {
|
|
||||||
field = value
|
|
||||||
displayDayNumber()
|
|
||||||
}
|
|
||||||
|
|
||||||
var numOfDayView : TextView? = null
|
|
||||||
var numberOfday : Int = -1
|
|
||||||
set(value) {
|
|
||||||
Log.e(TAG, "numOfDayView 2 (${R.id.day_num}) Id >>>> ${value}")
|
|
||||||
field = value
|
|
||||||
numOfDayView = findViewById<TextView>(field)
|
|
||||||
Log.e(TAG, "numOfDayView >>>> 3 ${numOfDayView}")
|
|
||||||
}
|
|
||||||
|
|
||||||
// override fun appyAttrs(context: Context?, attrs: AttributeSet?) {
|
|
||||||
// context?.let {
|
|
||||||
// Log.e(TAG, "numOfDayView >>>> ${numOfDayView}")
|
|
||||||
// var typedArray = it.obtainStyledAttributes(attrs, R.styleable.BaseCustomViews)
|
|
||||||
// layouId = typedArray.getResourceId(R.styleable.BaseCustomViews_item_layout,R.layout.item_day).apply {
|
|
||||||
// Log.e(TAG, "layouId 0 (${R.layout.item_day} Id >>>> ${this}")
|
|
||||||
// }
|
|
||||||
// initLayout(context)
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
override fun onTypedArray(context: Context, typedArray: TypedArray) {
|
|
||||||
super.onTypedArray(context, typedArray)
|
|
||||||
numberOfday = typedArray.getResourceId(R.styleable.BaseCustomViews_numOfDayId, R.id.day_num).apply {
|
|
||||||
Log.e(TAG, "numOfDayView 1 (${R.id.day_num}) Id >>>> ${this}")
|
|
||||||
}
|
|
||||||
displayDayNumber()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun createdLayout(view: View) {
|
|
||||||
super.createdLayout(view)
|
|
||||||
(view as? ViewGroup)?.let {
|
|
||||||
it.children.forEach { Log.e(TAG,"child is ${it}") }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun displayDayNumber() {
|
|
||||||
numOfDayView?.text = dayInfo?.getNumOfDay()?.toString() ?: "TEST"
|
|
||||||
Log.e(TAG, "numOfDayView?.text >>>> 4 ${numOfDayView?.text}")
|
|
||||||
}
|
|
||||||
|
|
||||||
fun displayDayOfWeek() {
|
|
||||||
//todo 오늘의 요일을 표시?
|
|
||||||
}
|
|
||||||
|
|
||||||
fun isToday() : Boolean {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
|
|
||||||
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
|
|
||||||
Log.e(TAG,"View >>> ${this}")
|
|
||||||
}
|
|
||||||
|
|
||||||
// override fun draw(canvas: Canvas) {
|
|
||||||
// super.draw(canvas)
|
|
||||||
// canvas.drawColor(Color.CYAN)
|
|
||||||
// }
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -0,0 +1,285 @@
|
|||||||
|
package com.example.calrendarview
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.graphics.Canvas
|
||||||
|
import android.graphics.Color
|
||||||
|
import android.os.Build
|
||||||
|
import android.util.AttributeSet
|
||||||
|
import android.util.Log
|
||||||
|
import android.util.TypedValue
|
||||||
|
import android.view.Gravity
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import android.widget.LinearLayout
|
||||||
|
import android.widget.TextView
|
||||||
|
import androidx.annotation.RequiresApi
|
||||||
|
import androidx.constraintlayout.widget.ConstraintLayout
|
||||||
|
import androidx.core.view.children
|
||||||
|
import androidx.core.view.contains
|
||||||
|
import androidx.viewpager2.widget.ViewPager2
|
||||||
|
import androidx.viewpager2.widget.ViewPager2.ORIENTATION_HORIZONTAL
|
||||||
|
import androidx.viewpager2.widget.ViewPager2.Orientation
|
||||||
|
import com.example.calrendarview.Adapter.PagerAdapter
|
||||||
|
import com.example.calrendarview.model.CalendarBean
|
||||||
|
import com.example.calrendarview.model.CalendarFactory
|
||||||
|
import java.time.LocalDate
|
||||||
|
|
||||||
|
@RequiresApi(Build.VERSION_CODES.O)
|
||||||
|
class MonthLayout: BaseCustomLayout {
|
||||||
|
constructor(context: Context) : super(context)
|
||||||
|
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
|
||||||
|
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
|
||||||
|
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes)
|
||||||
|
|
||||||
|
|
||||||
|
private var isInitializing: Boolean = false
|
||||||
|
private var listDayView: ArrayList<ViewGroup> = arrayListOf()
|
||||||
|
private val numberOfRow : Int = 7
|
||||||
|
private val numberOfWeek : Int = 6
|
||||||
|
var listOfBean: Array<CalendarBean> = arrayOf()
|
||||||
|
private var listHeaderView: ArrayList<View> = arrayListOf()
|
||||||
|
private var isShowingHeader: Boolean = true
|
||||||
|
private var heightOfHeader: Int = 50
|
||||||
|
var targetYear: Int = 0
|
||||||
|
var targetMonth: Int = 0
|
||||||
|
private var titleView: View? = null
|
||||||
|
private var heightOfTitle: Int = 100
|
||||||
|
private var header: LinearLayout? = null
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Constraint Layout -----------------------------------------------------
|
||||||
|
override fun onAttachedToWindow() {
|
||||||
|
super.onAttachedToWindow()
|
||||||
|
this.removeAllViews()
|
||||||
|
// Make data
|
||||||
|
// setData(LocalDate.now())
|
||||||
|
Log.d(tag, "listOfBean.size ${listOfBean.size}")
|
||||||
|
// Create view for title
|
||||||
|
createTitle()
|
||||||
|
// Create view for day of week
|
||||||
|
createHeader()
|
||||||
|
Log.e(tag, "listHeaderView.size ${listHeaderView.size}")
|
||||||
|
// Create day views and add.
|
||||||
|
Log.e(tag, "idLayout ${idLayout}")
|
||||||
|
createdDayView()
|
||||||
|
Log.d(tag, "listDayView.size ${listDayView.size}")
|
||||||
|
// Bind day views with data
|
||||||
|
if (listDayView.isNotEmpty()) {
|
||||||
|
for (i in 0 until listDayView.size) {
|
||||||
|
bindWidthData(listDayView[i], listOfBean[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// size
|
||||||
|
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
|
||||||
|
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
|
||||||
|
isInitializing = true
|
||||||
|
val selfW = MeasureSpec.getSize(widthMeasureSpec)
|
||||||
|
val selfH = MeasureSpec.getSize(heightMeasureSpec)
|
||||||
|
Log.d(tag, "selfW, selfH => ${selfW} ,${selfH}")
|
||||||
|
// Set size of view for day of week
|
||||||
|
Log.d(tag, "header measuredW, measuredH => ${header?.measuredWidth} ,${header?.measuredHeight}")
|
||||||
|
listHeaderView.forEachIndexed { _, view ->
|
||||||
|
// view.layoutParams = LayoutParams(selfW/numberOfRow, heightOfHeader)
|
||||||
|
Log.d(tag, "header view child measuredW, measuredH => ${view.measuredWidth} ,${view.measuredHeight}")
|
||||||
|
}
|
||||||
|
// Set size of day views
|
||||||
|
listDayView.forEachIndexed { _, view ->
|
||||||
|
// view.layoutParams = LayoutParams(selfW/numberOfRow, (selfH - (if (isShowingHeader) heightOfHeader else 0) - heightOfTitle)/numberOfWeek)
|
||||||
|
val headerH = if (isShowingHeader) heightOfHeader else 0
|
||||||
|
val titleH = titleView?.measuredHeight ?: 0
|
||||||
|
val w = selfW/numberOfRow
|
||||||
|
val h = (selfH - titleH - headerH)/numberOfWeek
|
||||||
|
view.measure(w, h)
|
||||||
|
Log.d(tag, "day view measuredW, measuredH => ${view.measuredWidth} ,${view.measuredHeight}")
|
||||||
|
}
|
||||||
|
// title view
|
||||||
|
Log.d(tag, "title view measuredW, measuredH => ${titleView?.measuredWidth} ,${titleView?.measuredHeight}")
|
||||||
|
isInitializing = false
|
||||||
|
}
|
||||||
|
|
||||||
|
// location
|
||||||
|
override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
|
||||||
|
super.onLayout(changed, left, top, right, bottom)
|
||||||
|
// Locate Title view
|
||||||
|
// locatedTitleView()
|
||||||
|
// Locate view for day of week
|
||||||
|
locatedHeaderView(listHeaderView)
|
||||||
|
// Locate day views
|
||||||
|
locatedDayView(listDayView)
|
||||||
|
|
||||||
|
requestLayout()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onDraw(canvas: Canvas) {
|
||||||
|
super.onDraw(canvas)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun requestLayout() {
|
||||||
|
if (isInitializing) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
super.requestLayout()
|
||||||
|
Log.e(tag, "did requestLayout")
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// fun
|
||||||
|
private fun setData(date: LocalDate) {
|
||||||
|
listOfBean = arrayOf()
|
||||||
|
listOfBean = CalendarFactory().getBeansOfThisMonth()
|
||||||
|
targetYear = LocalDate.now().year
|
||||||
|
targetMonth = LocalDate.now().monthValue
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun createdDayView() {
|
||||||
|
Log.d(tag, "on createdDayView")
|
||||||
|
isInitializing = true
|
||||||
|
// create and add to listDayView
|
||||||
|
listDayView.clear()
|
||||||
|
for (i in 0 until numberOfRow * numberOfWeek) {
|
||||||
|
listDayView.add((LayoutInflater.from(context).inflate(idLayout, this, false) as ViewGroup))
|
||||||
|
}
|
||||||
|
// add children
|
||||||
|
listDayView.forEach {
|
||||||
|
this.addView(it)
|
||||||
|
}
|
||||||
|
isInitializing = false
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private fun bindWidthData(view: ViewGroup, bean: CalendarBean) {
|
||||||
|
textViewNumOfDay = view.findViewById<TextView>(idTextViewNumOfDay).apply {
|
||||||
|
this.text = bean.getNumOfDay().toString()
|
||||||
|
if (targetMonth != bean.getMonth()) {
|
||||||
|
this.setTextColor(Color.parseColor("#cccccc"))
|
||||||
|
view.children.forEach {c ->
|
||||||
|
if (c != this) {
|
||||||
|
c.visibility = GONE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun createTitle() {
|
||||||
|
if (titleView != null) {
|
||||||
|
titleView = null
|
||||||
|
}
|
||||||
|
titleView = TextView(context).apply {
|
||||||
|
this.id
|
||||||
|
this.layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, heightOfTitle)
|
||||||
|
this.text = "$targetYear $targetMonth"
|
||||||
|
this.textSize = 18f
|
||||||
|
this.gravity = Gravity.CENTER
|
||||||
|
this.setBackgroundColor(Color.parseColor("#99ffff"))
|
||||||
|
}
|
||||||
|
this.addView(titleView)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun createHeader() {
|
||||||
|
|
||||||
|
// if(header == null) {
|
||||||
|
header = LinearLayout(context).apply {
|
||||||
|
this.layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, heightOfHeader)
|
||||||
|
this.orientation = ORIENTATION_HORIZONTAL
|
||||||
|
}
|
||||||
|
this.addView(header)
|
||||||
|
// }
|
||||||
|
|
||||||
|
// 주간 요일 표시
|
||||||
|
for (i in 0 until numberOfRow) {
|
||||||
|
Log.d(this@MonthLayout.tag, "getDayOfWeek ${listOfBean[i].getDayOfWeek()}")
|
||||||
|
TextView(context).apply {
|
||||||
|
this.layoutParams = LinearLayout.LayoutParams(0, heightOfHeader, 1f)
|
||||||
|
this.text = listOfBean[i].getDayOfWeek()
|
||||||
|
this.textSize = 8f
|
||||||
|
this.gravity = Gravity.CENTER
|
||||||
|
this.setBackgroundColor(Color.parseColor("#eeeeee"))
|
||||||
|
listHeaderView.add(this)
|
||||||
|
}.run {
|
||||||
|
header!!.addView(this)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
fun locatedTitleView() {
|
||||||
|
isInitializing = true
|
||||||
|
titleView?.let {
|
||||||
|
it.layout(
|
||||||
|
this.x.toInt(),
|
||||||
|
this.y.toInt(),
|
||||||
|
this.x.toInt() + it.measuredWidth,
|
||||||
|
this.y.toInt() + it.measuredHeight
|
||||||
|
)
|
||||||
|
Log.d(tag, "locatedTitleView s = ${this.x.toInt()}")
|
||||||
|
Log.d(tag, "locatedTitleView t = ${this.y.toInt()}")
|
||||||
|
Log.d(tag, "locatedTitleView e = ${this.x.toInt() + it.measuredWidth}")
|
||||||
|
Log.d(tag, "locatedTitleView b = ${this.y.toInt() + it.measuredHeight}")
|
||||||
|
}
|
||||||
|
isInitializing = false
|
||||||
|
}
|
||||||
|
|
||||||
|
fun locatedHeaderView(list: ArrayList<View>) {
|
||||||
|
var mutableX = this.x.toInt()
|
||||||
|
val mutableY = this.y.toInt()
|
||||||
|
val headerH = if (isShowingHeader) heightOfHeader else 0
|
||||||
|
isInitializing = true
|
||||||
|
header?.let{
|
||||||
|
it.layout(
|
||||||
|
mutableX,
|
||||||
|
mutableY + (titleView?.measuredHeight ?: 0),
|
||||||
|
mutableX + it.measuredWidth,
|
||||||
|
mutableY + (titleView?.measuredHeight ?: 0) + it.measuredHeight
|
||||||
|
)
|
||||||
|
}
|
||||||
|
list.forEach {
|
||||||
|
if (header?.contains(it) ?: false &&
|
||||||
|
it.visibility != GONE) {
|
||||||
|
Log.d(tag, "Header s, t => ${header!!.x}, ${header!!.y}")
|
||||||
|
Log.d(tag, "Header e, b => ${header!!.x + header!!.measuredWidth}, ${header!!.y + header!!.measuredHeight}")
|
||||||
|
Log.d(tag, "locatedHeaderView s, t => ${it.x}, ${it.y}")
|
||||||
|
Log.d(tag, "locatedHeaderView e, b => ${it.x + it.measuredWidth}, ${it.y + it.measuredHeight}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
isInitializing = false
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun locatedDayView(list: ArrayList<ViewGroup>) {
|
||||||
|
var mutableX = this.x.toInt()
|
||||||
|
val headerH = if (isShowingHeader) heightOfHeader else 0
|
||||||
|
val titleH = titleView?.measuredHeight ?: 0
|
||||||
|
var mutableY = this.y.toInt() + headerH + titleH
|
||||||
|
Log.e(tag, "locatedDayView mutableX, mutableY ${this.x.toInt()}, ${this.y.toInt()}")
|
||||||
|
val w = this.measuredWidth/numberOfRow
|
||||||
|
val h = (this.measuredHeight - titleH - headerH)/numberOfWeek
|
||||||
|
isInitializing = true
|
||||||
|
list.forEachIndexed { i, it ->
|
||||||
|
if (this.contains(it) &&
|
||||||
|
it.visibility != GONE) {
|
||||||
|
if (i % numberOfRow == 0 &&
|
||||||
|
i != 0) {
|
||||||
|
mutableX = this.x.toInt()
|
||||||
|
mutableY += h
|
||||||
|
}
|
||||||
|
Log.e(tag, "locatedDayView x y ${mutableX}, ${mutableY + headerH + titleH}")
|
||||||
|
Log.e(tag, "locatedDayView r e ${mutableX + w}, ${mutableY + h}")
|
||||||
|
it.layout(
|
||||||
|
mutableX,
|
||||||
|
mutableY,
|
||||||
|
mutableX + w,
|
||||||
|
mutableY + h
|
||||||
|
)
|
||||||
|
mutableX += w
|
||||||
|
Log.e(tag, "locatedDayView x y ${it.x}, ${it.y}")
|
||||||
|
Log.e(tag, "locatedDayView r e ${it.x + it.measuredWidth}, ${it.y + it.measuredHeight}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
isInitializing = false
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,111 +0,0 @@
|
|||||||
package com.example.calrendarview
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.content.res.TypedArray
|
|
||||||
import android.os.Build
|
|
||||||
import android.util.AttributeSet
|
|
||||||
import android.util.Log
|
|
||||||
import android.view.LayoutInflater
|
|
||||||
import android.view.View
|
|
||||||
import android.view.ViewGroup
|
|
||||||
import android.widget.TextView
|
|
||||||
import androidx.annotation.RequiresApi
|
|
||||||
import androidx.core.view.size
|
|
||||||
import com.example.calrendarview.model.CalendarFactory
|
|
||||||
import com.example.calrendarview.model.DayInfo
|
|
||||||
|
|
||||||
@RequiresApi(Build.VERSION_CODES.O)
|
|
||||||
class MonthView : BaseCustomViews {
|
|
||||||
constructor(context: Context) : super(context)
|
|
||||||
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
|
|
||||||
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
|
|
||||||
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes)
|
|
||||||
|
|
||||||
|
|
||||||
override fun appyAttrs(context: Context?, attrs: AttributeSet?) {
|
|
||||||
super.appyAttrs(context, attrs)
|
|
||||||
}
|
|
||||||
|
|
||||||
var numberOfRow : Int = 7
|
|
||||||
set(value) {
|
|
||||||
field = value
|
|
||||||
}
|
|
||||||
|
|
||||||
var dayInfo: DayInfo? = null
|
|
||||||
set(value) {
|
|
||||||
field = value
|
|
||||||
displayDayNumber()
|
|
||||||
}
|
|
||||||
|
|
||||||
var numberOfday : Int = -1
|
|
||||||
set(value) {
|
|
||||||
field = value
|
|
||||||
numOfDayView = findViewById<TextView>(field)
|
|
||||||
}
|
|
||||||
var itemLayout : Int = -1
|
|
||||||
set(value) {
|
|
||||||
field = value
|
|
||||||
}
|
|
||||||
|
|
||||||
var numOfDayView : TextView? = null
|
|
||||||
|
|
||||||
var mWidth: Int? = null
|
|
||||||
var mHeight: Int? = null
|
|
||||||
|
|
||||||
|
|
||||||
override fun onTypedArray(context: Context, typedArray: TypedArray) {
|
|
||||||
super.onTypedArray(context, typedArray)
|
|
||||||
numberOfday = typedArray.getResourceId(R.styleable.BaseCustomViews_numOfDayId, R.id.day_num)
|
|
||||||
itemLayout = typedArray.getResourceId(R.styleable.BaseCustomViews_item_layout, R.id.day_num)
|
|
||||||
displayDayNumber()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
|
|
||||||
super.onLayout(changed, left, top, right, bottom)
|
|
||||||
Log.i("MonthView >>> ","onLayout")
|
|
||||||
initChildViews()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun initChildViews(): Array<View?> {
|
|
||||||
//todo : 7 * numberOfRow 의 차일드 뷰를 만든다.
|
|
||||||
val infos = CalendarFactory().getBeansOfThisWeek()
|
|
||||||
val childrens = Array<View?>(numberOfRow) {i ->
|
|
||||||
val dayView = LayoutInflater.from(context).inflate(layouId, this, false)
|
|
||||||
val p = ViewGroup.LayoutParams(100, 100)
|
|
||||||
Log.i("MonthView >>> ","numberOfRow ${numberOfRow}")
|
|
||||||
dayView?.let {
|
|
||||||
it.layoutParams = p
|
|
||||||
Log.i("MonthView >>> ","dayView.width ${dayView.width}")
|
|
||||||
numOfDayView?.text = infos[i].getNumOfDay().toString()
|
|
||||||
addView(it)
|
|
||||||
}
|
|
||||||
return@Array dayView
|
|
||||||
}
|
|
||||||
Log.i("MonthView initChildViews >>> ","childrens count ${childrens.size}")
|
|
||||||
Log.i("MonthView initChildViews >>> ","mWidth ${width}")
|
|
||||||
Log.i("MonthView initChildViews >>> ","mHeight ${height}")
|
|
||||||
return childrens
|
|
||||||
}
|
|
||||||
|
|
||||||
fun displayDayNumber() {
|
|
||||||
numOfDayView?.text = dayInfo?.getNumOfDay()?.toString() ?: "TEST"
|
|
||||||
Log.e(TAG, "numOfDayView?.text >>>> 4 ${numOfDayView?.text}")
|
|
||||||
}
|
|
||||||
|
|
||||||
fun displyMonthOfNumber() {
|
|
||||||
//todo :월 표시
|
|
||||||
}
|
|
||||||
|
|
||||||
fun displayWeekHeader() {
|
|
||||||
//todo 주간 요일 표시
|
|
||||||
}
|
|
||||||
|
|
||||||
fun displayYear(){
|
|
||||||
//todo 년도 표시
|
|
||||||
}
|
|
||||||
|
|
||||||
fun setData(days : Collection<DayInfo>) {
|
|
||||||
//todo 최대 7*6의 데이터를 받는다.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@ -0,0 +1,188 @@
|
|||||||
|
package com.example.calrendarview
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.graphics.Canvas
|
||||||
|
import android.graphics.Color
|
||||||
|
import android.os.Build
|
||||||
|
import android.util.AttributeSet
|
||||||
|
import android.util.Log
|
||||||
|
import android.view.Gravity
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import android.widget.TextView
|
||||||
|
import androidx.annotation.RequiresApi
|
||||||
|
import androidx.constraintlayout.widget.ConstraintLayout
|
||||||
|
import androidx.core.view.children
|
||||||
|
import androidx.core.view.contains
|
||||||
|
import androidx.core.view.forEach
|
||||||
|
import androidx.core.view.get
|
||||||
|
import com.example.calrendarview.model.CalendarBean
|
||||||
|
import com.example.calrendarview.model.CalendarFactory
|
||||||
|
import com.example.calrendarview.model.DayInfo
|
||||||
|
import java.time.LocalDate
|
||||||
|
|
||||||
|
@RequiresApi(Build.VERSION_CODES.O)
|
||||||
|
class WeekLayout : BaseCustomLayout {
|
||||||
|
constructor(context: Context) : super(context)
|
||||||
|
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
|
||||||
|
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
|
||||||
|
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes)
|
||||||
|
|
||||||
|
|
||||||
|
// view
|
||||||
|
private val numberOfRow : Int = 7
|
||||||
|
private var listDayView: ArrayList<View> = arrayListOf()
|
||||||
|
private var listHeaderView: ArrayList<View> = arrayListOf()
|
||||||
|
private var heightOfHeader: Int = 50
|
||||||
|
private var isShowingHeader: Boolean = true
|
||||||
|
// data
|
||||||
|
private var listOfBean: Array<CalendarBean> = arrayOf()
|
||||||
|
// state, flag
|
||||||
|
private var isInitializing: Boolean = false
|
||||||
|
|
||||||
|
|
||||||
|
// Constraint Layout -----------------------------------------------------
|
||||||
|
override fun onAttachedToWindow() {
|
||||||
|
super.onAttachedToWindow()
|
||||||
|
// Create day views and add.
|
||||||
|
createdDayView()
|
||||||
|
// Bind day views with data
|
||||||
|
setData(LocalDate.now())
|
||||||
|
if (listDayView.isNotEmpty()) {
|
||||||
|
for (i in 0 until numberOfRow) {
|
||||||
|
bindWidthData(listDayView[i], listOfBean[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Create view for day of week
|
||||||
|
createHeader()
|
||||||
|
}
|
||||||
|
|
||||||
|
// size
|
||||||
|
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
|
||||||
|
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
|
||||||
|
isInitializing = true
|
||||||
|
val selfW = MeasureSpec.getSize(widthMeasureSpec)
|
||||||
|
val selfH = MeasureSpec.getSize(heightMeasureSpec)
|
||||||
|
// Set size of day views
|
||||||
|
listDayView.forEachIndexed { _, view ->
|
||||||
|
Log.e(tag, "idLayout ${idLayout}")
|
||||||
|
view.layoutParams = LayoutParams(selfW/numberOfRow, selfH)
|
||||||
|
}
|
||||||
|
// Set size of view for day of week
|
||||||
|
Log.e(tag, "listHeaderView.size ${listHeaderView.size}")
|
||||||
|
listHeaderView.forEachIndexed { _, view ->
|
||||||
|
view.layoutParams = LayoutParams(selfW/numberOfRow, if (isShowingHeader) heightOfHeader else 0)
|
||||||
|
}
|
||||||
|
isInitializing = false
|
||||||
|
}
|
||||||
|
|
||||||
|
// location
|
||||||
|
override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
|
||||||
|
super.onLayout(changed, left, top, right, bottom)
|
||||||
|
// Locate view for day of week
|
||||||
|
locatedHeaderView(listHeaderView)
|
||||||
|
// Locate day views
|
||||||
|
locatedDayView(listDayView)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onDraw(canvas: Canvas) {
|
||||||
|
super.onDraw(canvas)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun requestLayout() {
|
||||||
|
if (isInitializing) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
super.requestLayout()
|
||||||
|
Log.e(tag, "on requestLayout")
|
||||||
|
}
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// BaseCustomLayout ------------------------------------------
|
||||||
|
// override fun initLayout(context: Context?) {
|
||||||
|
// super.initLayout(context)
|
||||||
|
// }
|
||||||
|
// -----------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
private fun createdDayView() {
|
||||||
|
Log.e(tag, "on createdDayView")
|
||||||
|
isInitializing = true
|
||||||
|
// create and add to listDayView
|
||||||
|
listDayView.clear()
|
||||||
|
for (i in 0 until numberOfRow) {
|
||||||
|
Log.e(tag, "idLayout ${idLayout}")
|
||||||
|
listDayView.add(LayoutInflater.from(context).inflate(idLayout, this, false))
|
||||||
|
}
|
||||||
|
Log.e(tag, "listDayView.size ${listDayView.size}")
|
||||||
|
// add children
|
||||||
|
listDayView.forEach {
|
||||||
|
this.addView(it)
|
||||||
|
}
|
||||||
|
isInitializing = false
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun locatedDayView(list: ArrayList<View>) {
|
||||||
|
var mutableX = this.x.toInt()
|
||||||
|
val mutableY = this.y.toInt()
|
||||||
|
val headerH = if (isShowingHeader) heightOfHeader else 0
|
||||||
|
isInitializing = true
|
||||||
|
list.forEach {
|
||||||
|
if (this.contains(it) &&
|
||||||
|
it.visibility != GONE) {
|
||||||
|
it.layout(mutableX, mutableY + headerH, mutableX + it.measuredWidth, mutableY + it.measuredHeight + headerH)
|
||||||
|
mutableX += it.measuredWidth
|
||||||
|
Log.e(tag, "locatedDayView x y ${mutableX}, ${ this.y}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
isInitializing = false
|
||||||
|
requestLayout()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun setData(date: LocalDate) {
|
||||||
|
listOfBean = arrayOf()
|
||||||
|
listOfBean = CalendarFactory().getBeansOfWeek(date)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun bindWidthData(view: View, bean: CalendarBean) {
|
||||||
|
textViewNumOfDay = view.findViewById<TextView>(idTextViewNumOfDay).apply {
|
||||||
|
this.text = bean.getNumOfDay().toString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun createHeader() {
|
||||||
|
//todo 주간 요일 표시
|
||||||
|
for (i in 0 until numberOfRow) {
|
||||||
|
Log.e(tag, "getDayOfWeek ${listOfBean[i].getDayOfWeek()}")
|
||||||
|
TextView(context).apply {
|
||||||
|
this.text = listOfBean[i].getDayOfWeek()
|
||||||
|
this.textSize = 8f
|
||||||
|
this.width = listDayView[i].width
|
||||||
|
this.height = 50
|
||||||
|
this.gravity = Gravity.CENTER
|
||||||
|
this.setBackgroundColor(Color.parseColor("#eeeeee"))
|
||||||
|
listHeaderView.add(this)
|
||||||
|
this@WeekLayout.addView(this)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun locatedHeaderView(list: ArrayList<View>) {
|
||||||
|
var mutableX = this.x.toInt()
|
||||||
|
val mutableY = this.y.toInt()
|
||||||
|
val headerH = if (isShowingHeader) heightOfHeader else 0
|
||||||
|
isInitializing = true
|
||||||
|
list.forEach {
|
||||||
|
if (this.contains(it) &&
|
||||||
|
it.visibility != GONE) {
|
||||||
|
it.layout(mutableX, mutableY, mutableX + it.measuredWidth, mutableY + headerH)
|
||||||
|
mutableX += it.measuredWidth
|
||||||
|
Log.e(tag, "locatedHeaderView x y ${mutableX}, ${ this.y}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
isInitializing = false
|
||||||
|
requestLayout()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@ -1,6 +1,7 @@
|
|||||||
package com.example.calrendarview.model
|
package com.example.calrendarview.model
|
||||||
|
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
|
import android.util.Log
|
||||||
import androidx.annotation.RequiresApi
|
import androidx.annotation.RequiresApi
|
||||||
import java.time.DayOfWeek
|
import java.time.DayOfWeek
|
||||||
import java.time.LocalDate
|
import java.time.LocalDate
|
||||||
@ -19,9 +20,53 @@ class CalendarFactory {
|
|||||||
fun getBeansOfThisWeek(): Array<CalendarBean> = getBeansOfWeek(LocalDate.now())
|
fun getBeansOfThisWeek(): Array<CalendarBean> = getBeansOfWeek(LocalDate.now())
|
||||||
|
|
||||||
fun getBeansOfMonth(y: Int, m:Int): Array<CalendarBean> {
|
fun getBeansOfMonth(y: Int, m:Int): Array<CalendarBean> {
|
||||||
|
Log.d("CalendarFactory", "YearMonth.of(y, m) : ${YearMonth.of(y, m)}")
|
||||||
|
Log.d("CalendarFactory", "YearMonth.of(y, m).lengthOfMonth() : ${YearMonth.of(y, m).lengthOfMonth()}")
|
||||||
val daysInMonth = YearMonth.of(y, m).lengthOfMonth()
|
val daysInMonth = YearMonth.of(y, m).lengthOfMonth()
|
||||||
return Array<CalendarBean>(daysInMonth) {
|
val thisMonth = Array<CalendarBean>(daysInMonth) {
|
||||||
CalendarBean(y, m, it + 1)
|
CalendarBean(y, m, it + 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val lastY = if (m != 1) y else y - 1
|
||||||
|
val lastM = if (m != 1) m - 1 else 12
|
||||||
|
val lastDaysInMonth = YearMonth.of(lastY, lastM).lengthOfMonth()
|
||||||
|
val lastMonth = Array<CalendarBean>(lastDaysInMonth) {
|
||||||
|
CalendarBean(lastY, lastM, it + 1)
|
||||||
|
}
|
||||||
|
var lastArray : Array<CalendarBean> = arrayListOf<CalendarBean>().run {
|
||||||
|
if (thisMonth[0].getDayOfWeek() != "SUNDAY") {
|
||||||
|
for (i in lastMonth.size - 1 downTo 0) {
|
||||||
|
this.add(lastMonth[i])
|
||||||
|
if (lastMonth[i].getDayOfWeek() == "SUNDAY") {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
arrayOf<CalendarBean>() + this
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
val nextY = if (m != 12) y else y + 1
|
||||||
|
val nextM = if (m != 12) m + 1 else 1
|
||||||
|
val nextDaysInMonth = YearMonth.of(nextY, nextM).lengthOfMonth()
|
||||||
|
val nextMonth = Array<CalendarBean>(nextDaysInMonth) {
|
||||||
|
CalendarBean(nextY, nextM, it + 1)
|
||||||
|
}
|
||||||
|
var nextArray : ArrayList<CalendarBean> = arrayListOf()
|
||||||
|
val need = 42 - (thisMonth + lastArray).size
|
||||||
|
for (i in 0 until need) {
|
||||||
|
nextArray.add(nextMonth[i])
|
||||||
|
}
|
||||||
|
|
||||||
|
val r = lastArray.reversedArray() + thisMonth + nextArray
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
fun getBeansOfMonth(pod: CalendarPod): Array<CalendarBean> = getBeansOfMonth(pod.year, pod.month)
|
||||||
|
|
||||||
|
|
||||||
|
fun getBeansOfThisMonth(): Array<CalendarBean> {
|
||||||
|
return LocalDate.now().run {
|
||||||
|
getBeansOfMonth(this.year, this.monthValue)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -0,0 +1,21 @@
|
|||||||
|
package com.example.calrendarview.model
|
||||||
|
|
||||||
|
import android.os.Build
|
||||||
|
import androidx.annotation.RequiresApi
|
||||||
|
import java.time.LocalDate
|
||||||
|
|
||||||
|
@RequiresApi(Build.VERSION_CODES.O)
|
||||||
|
class CalendarPod {
|
||||||
|
|
||||||
|
constructor(date: LocalDate) {
|
||||||
|
this.year = date.year
|
||||||
|
this.month = date.monthValue
|
||||||
|
}
|
||||||
|
constructor(y: Int, m: Int) {
|
||||||
|
this.year = y
|
||||||
|
this.month = m
|
||||||
|
}
|
||||||
|
|
||||||
|
val year: Int
|
||||||
|
val month: Int
|
||||||
|
}
|
||||||
@ -1,5 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
|
|||||||
@ -4,17 +4,18 @@
|
|||||||
<attr name="item_layout" format="reference"/>
|
<attr name="item_layout" format="reference"/>
|
||||||
<attr name="numOfDayId" format="reference"/>
|
<attr name="numOfDayId" format="reference"/>
|
||||||
|
|
||||||
<declare-styleable name="BaseCustomViews">
|
<declare-styleable name="BaseCustomLayout">
|
||||||
<attr name="item_layout"/>
|
<attr name="item_layout"/>
|
||||||
<attr name="numOfDayId"/>
|
<attr name="numOfDayId"/>
|
||||||
</declare-styleable>
|
</declare-styleable>
|
||||||
|
|
||||||
<declare-styleable name="DayView">
|
<declare-styleable name="DayLayout">
|
||||||
<!-- <attr name="item_layout"/>-->
|
<!-- <attr name="item_layout"/>-->
|
||||||
<!-- <attr name="numOfDayId"/>-->
|
<!-- <attr name="numOfDayId"/>-->
|
||||||
</declare-styleable>
|
</declare-styleable>
|
||||||
|
|
||||||
<declare-styleable name="MonthView">
|
<declare-styleable name="WeekLayout">
|
||||||
<!-- <attr name="item_layout"/>-->
|
<!-- <attr name="item_layout"/>-->
|
||||||
|
<!-- <attr name="numOfDayId"/>-->
|
||||||
</declare-styleable>
|
</declare-styleable>
|
||||||
</resources>
|
</resources>
|
||||||
@ -172,7 +172,7 @@ class CalendarLayout : FrameLayout {
|
|||||||
view!!.getHitRect(rect)
|
view!!.getHitRect(rect)
|
||||||
val isClick = rect.contains(ev.x.toInt(), ev.y.toInt())
|
val isClick = rect.contains(ev.x.toInt(), ev.y.toInt())
|
||||||
Log.d(
|
Log.d(
|
||||||
TAG,
|
"tag",
|
||||||
"isClickView() called with: isClick = [$isClick]"
|
"isClickView() called with: isClick = [$isClick]"
|
||||||
)
|
)
|
||||||
return isClick
|
return isClick
|
||||||
@ -302,7 +302,7 @@ class CalendarLayout : FrameLayout {
|
|||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private const val TAG = "CalendarLayout"
|
private const val tag = "CalendarLayout"
|
||||||
|
|
||||||
const val TYPE_OPEN = 0
|
const val TYPE_OPEN = 0
|
||||||
|
|
||||||
|
|||||||
@ -158,7 +158,7 @@ class CalendarView : ViewGroup {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
Log.i(
|
Log.i(
|
||||||
TAG,
|
"tag",
|
||||||
"onMeasure() called with: itemHeight = [$itemHeight], itemWidth = [$itemWidth]"
|
"onMeasure() called with: itemHeight = [$itemHeight], itemWidth = [$itemWidth]"
|
||||||
)
|
)
|
||||||
lastwidthMeasureSpec = widthMeasureSpec
|
lastwidthMeasureSpec = widthMeasureSpec
|
||||||
@ -199,6 +199,6 @@ class CalendarView : ViewGroup {
|
|||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private const val TAG = "CalendarView"
|
private const val tag = "CalendarView"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -9,8 +9,8 @@ import com.example.accountbook.calendar2.CalendarLayoutListener
|
|||||||
import com.example.accountbook.calendar2.CalendarManager
|
import com.example.accountbook.calendar2.CalendarManager
|
||||||
import com.example.accountbook.calendar2.CalendarPagerAdapter
|
import com.example.accountbook.calendar2.CalendarPagerAdapter
|
||||||
import com.example.accountbook.databinding.CalendarActivityExampleBinding
|
import com.example.accountbook.databinding.CalendarActivityExampleBinding
|
||||||
import com.example.accountbook.databinding.ExDayViewBinding
|
//import com.example.accountbook.databinding.ExDayLayoutBinding
|
||||||
import com.example.calrendarview.DayView
|
import com.example.calrendarview.DayLayout
|
||||||
import com.example.calrendarview.model.CalendarBean
|
import com.example.calrendarview.model.CalendarBean
|
||||||
import com.example.calrendarview.model.CalendarFactory
|
import com.example.calrendarview.model.CalendarFactory
|
||||||
import com.example.calrendarview.model.DayInfo
|
import com.example.calrendarview.model.DayInfo
|
||||||
@ -26,9 +26,9 @@ class ActivityCalendarEx: AppCompatActivity() {
|
|||||||
bind = CalendarActivityExampleBinding.inflate(this.layoutInflater)
|
bind = CalendarActivityExampleBinding.inflate(this.layoutInflater)
|
||||||
|
|
||||||
// for (i in 0 until 7) {
|
// for (i in 0 until 7) {
|
||||||
val infos = CalendarFactory().getBeansOfThisWeek()
|
// val infos = CalendarFactory().getBeansOfThisWeek()
|
||||||
// bind.otherViews.numberOfRow = 7
|
// bind.otherViews.numberOfRow = 7
|
||||||
// (bind.otherViews.getChildAt(i) as? DayView)?.dayInfo = infos.get(i)
|
// (bind.otherViews.getChildAt(i) as? DayLayout)?.infoDay = infos.get(i)
|
||||||
// }
|
// }
|
||||||
setContentView(bind.root)
|
setContentView(bind.root)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,15 +3,20 @@
|
|||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
<com.example.calrendarview.MonthView
|
<!-- <com.example.calrendarview.WeekLayout-->
|
||||||
android:id="@+id/otherViews"
|
<!-- android:id="@+id/otherViews"-->
|
||||||
|
<!-- android:layout_width="match_parent"-->
|
||||||
|
<!-- android:layout_height="wrap_content"-->
|
||||||
|
<!-- app:layout_constraintTop_toTopOf="parent"-->
|
||||||
|
<!-- app:item_layout="@layout/ex_day_view"-->
|
||||||
|
<!-- app:numOfDayId="@id/ex_text_day"-->
|
||||||
|
<!-- />-->
|
||||||
|
<com.example.calrendarview.CalendarLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="match_parent"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
app:item_layout="@layout/ex_day_view"
|
app:item_layout="@layout/ex_day_view"
|
||||||
app:numOfDayId="@id/ex_text_day"
|
app:numOfDayId="@id/ex_text_day" />
|
||||||
/>
|
|
||||||
|
|
||||||
<!-- <com.example.accountbook.calendar2.CalendarLayout-->
|
<!-- <com.example.accountbook.calendar2.CalendarLayout-->
|
||||||
<!-- android:id="@+id/calendarLayoutEx"-->
|
<!-- android:id="@+id/calendarLayoutEx"-->
|
||||||
<!-- android:background="#dddddd"-->
|
<!-- android:background="#dddddd"-->
|
||||||
@ -61,7 +66,7 @@
|
|||||||
<!--<!– app:layout_constraintBottom_toBottomOf="parent"–>-->
|
<!--<!– app:layout_constraintBottom_toBottomOf="parent"–>-->
|
||||||
<!--<!– />–>-->
|
<!--<!– />–>-->
|
||||||
<!-- </com.example.accountbook.calendar2.CalendarLayout>-->
|
<!-- </com.example.accountbook.calendar2.CalendarLayout>-->
|
||||||
<!-- <com.example.calrendarview.DayView-->
|
<!-- <com.example.calrendarview.DayLayout-->
|
||||||
<!-- android:id="@+id/test"-->
|
<!-- android:id="@+id/test"-->
|
||||||
<!-- android:layout_width="match_parent"-->
|
<!-- android:layout_width="match_parent"-->
|
||||||
<!-- android:layout_height="match_parent"-->
|
<!-- android:layout_height="match_parent"-->
|
||||||
|
|||||||
@ -2,40 +2,38 @@
|
|||||||
<androidx.constraintlayout.widget.ConstraintLayout
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="wrap_content"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
android:paddingVertical="10dp"
|
android:paddingVertical="10dp"
|
||||||
android:paddingHorizontal="5dp"
|
android:paddingHorizontal="1dp"
|
||||||
>
|
>
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/ex_text_day"
|
android:id="@+id/ex_text_day"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
android:gravity="end|center_vertical"
|
android:gravity="center"
|
||||||
android:text="01일"
|
android:text="01일"
|
||||||
android:textSize="15dp"
|
android:textSize="12dp"
|
||||||
/>
|
/>
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/ex_text_day_view_01"
|
android:id="@+id/ex_text_day_view_01"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
app:layout_constraintTop_toBottomOf="@id/ex_text_day"
|
app:layout_constraintTop_toBottomOf="@id/ex_text_day"
|
||||||
android:gravity="end|center_vertical"
|
android:gravity="start|center_vertical"
|
||||||
android:text="ex_text_day"
|
android:text="ex_text_day"
|
||||||
android:textSize="12dp"
|
android:textSize="8dp"
|
||||||
android:background="#9acd32"
|
android:layout_marginTop="8dp"
|
||||||
android:layout_marginTop="5dp"
|
|
||||||
/>
|
/>
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/ex_text_day_view_02"
|
android:id="@+id/ex_text_day_view_02"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
app:layout_constraintTop_toBottomOf="@id/ex_text_day_view_01"
|
app:layout_constraintTop_toBottomOf="@id/ex_text_day_view_01"
|
||||||
android:gravity="end|center_vertical"
|
android:gravity="start|center_vertical"
|
||||||
android:text="ex_text_day"
|
android:text="ex_text_day"
|
||||||
android:textSize="12dp"
|
android:textSize="8dp"
|
||||||
android:background="#dda0dd"
|
android:layout_marginTop="3dp"
|
||||||
android:layout_marginTop="5dp"
|
|
||||||
/>
|
/>
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
Loading…
x
Reference in New Issue
Block a user