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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | 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.