DayView demo – DSP#19

Jak pisałem poprzednim razem udało się już ukończyć bibliotekę, wszystko co chciałem zaimplementować udało się wdrożyć. Nie mniej przydała by się jakaś mała aplikacja która pozwoliła by pokazać jej możliwości. To właśnie taki jest kolejny krok i o tym dzisiaj napiszę.

Na początek kilka wymagań, chcę żeby aplikacja:

  • prezentowała możliwości API
  • posiadała odnośnik do źródeł biblioteki
  • oczywiście wyświetlała bibliotekę, przynajmniej w dwóch rozmiarach

Udało się tym wymaganiom sprostać, taki jest efekt końcowy:

Aplikacja będzie dostępna w sklepie Play o tutaj, a także na stronie githubowej. Ale to to wszystko dopiero jak uda mi się udostępnić bibliotekę, oraz napisać README, trochę ją wypromować. Tak wygląda kod źródłowy dla tego małego demka:

class MainActivity : AppCompatActivity() {

    var dayView: DayView? = null
    var dayView2: DayView? = null
    var applyBtn: Button? = null
    var borderBtn: Button? = null
    var backgroundBtn: Button? = null
    var textBtn: Button? = null
    var barBtn: Button? = null
    var dayEt: EditText? = null
    var monthEt: EditText? = null
    var borderColor: Int = Color.BLACK
    var backgroundColor: Int = Color.WHITE
    var textColor: Int = Color.BLACK
    var barColor: Int = Color.BLUE
    var date: Date = Date()
    var day: Int = 1
    var month: Int = 1
    val year: Int = 2016
    var url: TextView? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        dayView = findViewById(R.id.dayView) as DayView
        dayView2 = findViewById(R.id.dayView2) as DayView
        applyBtn = findViewById(R.id.apply_btn) as Button
        borderBtn = findViewById(R.id.borderColor_btn) as Button
        backgroundBtn = findViewById(R.id.backgroundColor_btn) as Button
        textBtn = findViewById(R.id.textColor_btn) as Button
        barBtn = findViewById(R.id.barColor_btn) as Button
        dayEt = findViewById(R.id.day_et) as EditText
        monthEt = findViewById(R.id.month_et) as EditText
        url = findViewById(R.id.url_tv) as TextView
        val toolbar = findViewById(R.id.toolbar) as Toolbar
        setSupportActionBar(toolbar)

        val pattern = Pattern.compile("https://github.com/migellal/DayView")
        Linkify.addLinks(url, pattern, "")

        applyBtn!!.setOnClickListener {
            if (dayEt!!.text != null && !dayEt!!.text.isEmpty()
                    && monthEt!!.text != null && !monthEt!!.text.isEmpty()) {
                day = dayEt!!.text.toString().toInt()
                month = monthEt!!.text.toString().toInt()
                month -= 1
            }
            date = Date(year, month, day)
            dayView!!.date = date
            dayView!!.borderColor = borderColor
            dayView!!.cardBackgroundColor = backgroundColor
            dayView!!.textColor = textColor
            dayView!!.barColor = barColor
            dayView2!!.date = date
            dayView2!!.borderColor = borderColor
            dayView2!!.cardBackgroundColor = backgroundColor
            dayView2!!.textColor = textColor
            dayView2!!.barColor = barColor
        }

        borderBtn!!.setOnClickListener {
            colorPicker(borderBtn as Button)
        }

        backgroundBtn!!.setOnClickListener {
            colorPicker(backgroundBtn as Button)
        }

        textBtn!!.setOnClickListener {
            colorPicker(textBtn as Button)
        }

        barBtn!!.setOnClickListener {
            colorPicker(barBtn as Button)
        }
    }

    private fun colorPicker(btn: Button) {
        ColorOMaticDialog.Builder()
                .initialColor(Color.BLACK)
                .colorMode(ColorMode.RGB)
                .indicatorMode(IndicatorMode.HEX)
                .onColorSelected {
                    btn.setBackgroundColor(it)
                    if (btn == borderBtn)
                        borderColor = it
                    else if (btn == backgroundBtn)
                        backgroundColor = it
                    else if (btn == textBtn)
                        textColor = it
                    else
                        barColor = it
                }
                .create()
                .show(supportFragmentManager, "ColorOMaticDialog")
    }

}

Kilka uwag do kodu, użyłem biblioteki color-o-matic do wyświetlania menu wyboru koloru. Android nie ma jej dostępnej natywnie, stąd mogłem albo użyć gotowej, albo pisać samemu. Dodatkowo kod listenerów w Kotlinie wygląda całkiem fajnie. Tzn, jeśli znajduje się tam tylko jedna metoda (np onClick()) to nie zapisujemy jej, tylko kod umieszczamy w nawiasach klamrowych. Kolejną ciekawostką jest słówko kluczowe it, które odnosi się do obiektu z którego korzystamy w danej metodzie. Na przykładzie implementacji color-o-matic, listener onColorSelected posiadał metodę onSelect, albo podobną. Nie trzeba jej wpisywać, żeby dostać się do parametru który jest tam podany, wystarczy użyć wspomnianego słówka kluczowego. Warto też wspomnieć, że do poziomego ułożenia telefonu został dopisany nowy layout dla demo, ponieważ domyślne ułożenie po obrocie mi się nie podobało. Poprawiłem też mały błąd, który powodował, że jeśli nie wstawiliśmy daty nic nie było wyświetlane, założeniem było, żeby wyświetlała się wtedy dzisiejsza data i tak teraz jest.

To tyle jeśli chodzi o demko, nie ma się tutaj co rozpisywać, najważniejsze, żeby pokazywało co biblioteka potrafi i wydaje mi się, że to zadanie zostało spełnione. Wszystkie zmiany zostały zaccomitowane i znajdują się tutaj. A następnym krokiem jest publikacja biblioteki.

Comments are closed.

  1. Najs! Michał już wita się z gąską… last post to go! 🙂