diff --git a/androidform/src/main/java/com/github/androiddevfr/form/rows/AbstractTitleRow.kt b/androidform/src/main/java/com/github/androiddevfr/form/rows/AbstractTitleRow.kt index d3a1a44..717c8cf 100644 --- a/androidform/src/main/java/com/github/androiddevfr/form/rows/AbstractTitleRow.kt +++ b/androidform/src/main/java/com/github/androiddevfr/form/rows/AbstractTitleRow.kt @@ -12,6 +12,8 @@ abstract class AbstractTitleRow(context: Context) : Row(context) { companion object { val DEFAULT_MARGIN_TOP = 6 + val DEFAULT_TITLE_MARGIN_BOTTOM = 4 + val DEFAULT_ICON_MARGIN_TOP = 8 val DEFAULT_MARGIN_BOTTOM = 8 val DEFAULT_MARGIN_LEFT = 16 val DEFAULT_MARGIN_RIGHT = 16 @@ -32,8 +34,8 @@ abstract class AbstractTitleRow(context: Context) : Row(context) { * Implementation of the TitleView visual aspect */ protected var customizeTitleView: ((AbstractTitleRow, TextView) -> Unit) = { row, textView -> - textView.setTextColor(Color.parseColor("#3E3E3E")) - textView.textSize = 16f + textView.setTextColor(Color.parseColor("#BEBEBE")) + textView.textSize = 12f } protected var customizeIconView: ((AbstractTitleRow, ImageView) -> Unit) = { row, imageView -> diff --git a/androidform/src/main/java/com/github/androiddevfr/form/rows/SelectionRow.kt b/androidform/src/main/java/com/github/androiddevfr/form/rows/SelectionRow.kt new file mode 100644 index 0000000..eab4946 --- /dev/null +++ b/androidform/src/main/java/com/github/androiddevfr/form/rows/SelectionRow.kt @@ -0,0 +1,127 @@ +package com.github.androiddevfr.form.rows + +import android.content.Context +import android.graphics.Color +import android.support.v7.widget.AppCompatSpinner +import android.view.View +import android.view.ViewGroup +import android.widget.* +import android.widget.LinearLayout.VERTICAL +import com.github.androiddevfr.form.core.DimensionUtils +import com.github.androiddevfr.form.core.DimensionUtils.dpToPx + + +class SelectionRow(context: Context) : AbstractTitleRow(context) { + + companion object { + val DEFAULT_TITLE_MARGIN_BOTTOM = 14 + val DEFAULT_PADDING_ROW_VERTICAL = 8 + val DEFAULT_PADDING_ROW_HORIZONTAL = 8 + } + + private var value: String? = null + + var items: List = listOf() + var defaultItem: String? = null + var spinnerRowLayoutId = android.R.layout.simple_spinner_item + + var customizeSelectionView: (SelectionRow, Spinner) -> Unit = { choiceRow, spinner -> + + } + + var customizeSelectionItemView: (SelectionRow, View, String) -> Unit = { choiceRow, row, value -> + val label = row as TextView + row.setPadding(dpToPx(DEFAULT_PADDING_ROW_HORIZONTAL), dpToPx(DEFAULT_PADDING_ROW_VERTICAL), dpToPx(DEFAULT_PADDING_ROW_HORIZONTAL), dpToPx(DEFAULT_PADDING_ROW_VERTICAL)) + label.setTextColor(Color.BLACK) + label.text = value + } + + var spacingBetweenTitleAndItems = DimensionUtils.dpToPx(DEFAULT_TITLE_MARGIN_BOTTOM) + + + /** + * Change this lambda to have a custom Selection View + */ + fun customizeSelectionView(block: (SelectionRow, Spinner) -> Unit) { + this.customizeSelectionView = block + } + + /** + * Change this lambda to have a custom Selection Item View + */ + fun customizeSelectionItemView(block: (SelectionRow, View, String) -> Unit) { + this.customizeSelectionItemView = block + } + + init { + onCreateView { + LinearLayout(context).apply { + orientation = VERTICAL + addView( + createTitleView(TITLE_VIEW_ID).apply { + titleView = this + }, + LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT).apply { + bottomMargin = spacingBetweenTitleAndItems + }) + + //TODO add icon + + var defaultIndex: Int? = null + val defaultItemValue: String? = defaultItem + if (defaultItemValue != null) { + defaultIndex = items.indexOf(defaultItemValue) + } + addView(createSelectionView(generateRowItemId(), items, defaultIndex)) + + setPadding( + DimensionUtils.dpToPx(DEFAULT_MARGIN_LEFT), + DimensionUtils.dpToPx(DEFAULT_MARGIN_TOP), + DimensionUtils.dpToPx(DEFAULT_MARGIN_RIGHT), + DimensionUtils.dpToPx(DEFAULT_MARGIN_BOTTOM) + ) + } + } + } + + private fun createSelectionView(viewId: Int, items: List, defaultIndex: Int?): Spinner { + val view = AppCompatSpinner(context).apply { + id = viewId + } as Spinner + + view.adapter = object : ArrayAdapter(context, spinnerRowLayoutId, items) { + override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { + val superView = super.getView(position, convertView, parent) + customizeSelectionItemView.invoke(this@SelectionRow, superView, this.getItem(position)) + return superView + } + + override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup): View { + val superView = super.getDropDownView(position, convertView, parent) + customizeSelectionItemView.invoke(this@SelectionRow, superView, this.getItem(position)) + return superView + } + } + + view.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) { + value = items[position] + } + + override fun onNothingSelected(parent: AdapterView<*>) { + value = null + } + } + + if (defaultIndex != null) { + view.setSelection(defaultIndex) + } + customizeSelectionView.invoke(this, view) + return view + } + + override fun value(): String? { + return value + } + +} \ No newline at end of file diff --git a/androidform/src/main/java/com/github/androiddevfr/form/rows/SingleChoiceRow.kt b/androidform/src/main/java/com/github/androiddevfr/form/rows/SingleChoiceRow.kt index 52c6f00..49fa22d 100644 --- a/androidform/src/main/java/com/github/androiddevfr/form/rows/SingleChoiceRow.kt +++ b/androidform/src/main/java/com/github/androiddevfr/form/rows/SingleChoiceRow.kt @@ -16,7 +16,7 @@ class SingleChoiceRow(context: Context) : AbstractTitleRow(context) { private var value: String? = null var items: List = listOf() - var defaultChecked: List = listOf() + var defaultChecked: String? = null var customizeSingleChoiceView: (SingleChoiceRow, CompoundButton) -> Unit = { choiceRow, compoundButton -> @@ -46,7 +46,7 @@ class SingleChoiceRow(context: Context) : AbstractTitleRow(context) { }) items.forEach { item -> - addView(createSingleChoiceView(generateRowItemId(), item, defaultChecked.contains(item))) + addView(createSingleChoiceView(generateRowItemId(), item, defaultChecked == item)) } setOnCheckedChangeListener { buttonView, checkedId -> diff --git a/androidform/src/main/java/com/github/androiddevfr/form/rows/SpinAdapter.kt b/androidform/src/main/java/com/github/androiddevfr/form/rows/SpinAdapter.kt new file mode 100644 index 0000000..a1e05d7 --- /dev/null +++ b/androidform/src/main/java/com/github/androiddevfr/form/rows/SpinAdapter.kt @@ -0,0 +1,37 @@ +package com.github.androiddevfr.form.rows + +import android.content.Context +import android.graphics.Color +import android.view.View +import android.view.ViewGroup +import android.widget.AdapterView +import android.widget.ArrayAdapter +import android.widget.Spinner +import android.widget.TextView + +class SpinAdapter(context: Context, resource: Int) { + + internal var spinner: Spinner? = null + + init { + spinner!!.adapter = object : ArrayAdapter(context, resource) { + override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { + return super.getView(position, convertView, parent) + } + + override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup): View { + return super.getDropDownView(position, convertView, parent) + } + } + + spinner!!.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) { + + } + + override fun onNothingSelected(parent: AdapterView<*>) { + + } + } + } +} \ No newline at end of file diff --git a/androidform/src/main/java/com/github/androiddevfr/form/rows/TextRow.kt b/androidform/src/main/java/com/github/androiddevfr/form/rows/TextRow.kt index a533661..fae156a 100644 --- a/androidform/src/main/java/com/github/androiddevfr/form/rows/TextRow.kt +++ b/androidform/src/main/java/com/github/androiddevfr/form/rows/TextRow.kt @@ -2,6 +2,7 @@ package com.github.androiddevfr.form.rows import android.content.Context import android.graphics.Color +import android.view.ViewGroup.LayoutParams.MATCH_PARENT import android.view.ViewGroup.LayoutParams.WRAP_CONTENT import android.widget.EditText import android.widget.RelativeLayout @@ -67,44 +68,37 @@ open class TextRow(context: Context) : AbstractTitleRow(context) { iconView = createIconView(ICON_VIEW_ID) } - val titleLayoutParams = RelativeLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT).apply { - leftMargin = DimensionUtils.dpToPx(DEFAULT_MARGIN_LEFT) - topMargin = DimensionUtils.dpToPx(DEFAULT_MARGIN_TOP) - bottomMargin = DimensionUtils.dpToPx(DEFAULT_MARGIN_BOTTOM) - rightMargin = DimensionUtils.dpToPx(DEFAULT_MARGIN_RIGHT) - - addRule(RelativeLayout.CENTER_VERTICAL) - } - if (iconView != null) { - titleLayoutParams.leftMargin = 0 - - titleLayoutParams.addRule(RelativeLayout.RIGHT_OF, iconView!!.id) layout.addView(iconView, RelativeLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT).apply { leftMargin = DimensionUtils.dpToPx(DEFAULT_MARGIN_LEFT) - topMargin = DimensionUtils.dpToPx(DEFAULT_MARGIN_TOP) + topMargin = DimensionUtils.dpToPx(DEFAULT_ICON_MARGIN_TOP) bottomMargin = DimensionUtils.dpToPx(DEFAULT_MARGIN_BOTTOM) rightMargin = DimensionUtils.dpToPx(DEFAULT_MARGIN_RIGHT) - addRule(RelativeLayout.CENTER_VERTICAL) - addRule(RelativeLayout.ALIGN_PARENT_LEFT) + addRule(RelativeLayout.BELOW, TITLE_VIEW_ID) + addRule(RelativeLayout.ALIGN_LEFT, TITLE_VIEW_ID) }) - } else { - titleLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT) } - layout.addView(editView, RelativeLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT).apply { - setMargins( - DimensionUtils.dpToPx(DEFAULT_MARGIN_LEFT), - DimensionUtils.dpToPx(DEFAULT_MARGIN_TOP), - DimensionUtils.dpToPx(DEFAULT_MARGIN_BOTTOM), - DimensionUtils.dpToPx(DEFAULT_MARGIN_RIGHT) + layout.addView(editView, RelativeLayout.LayoutParams(MATCH_PARENT, WRAP_CONTENT).apply { + if(iconView != null){ + addRule(RelativeLayout.RIGHT_OF, ICON_VIEW_ID) + addRule(RelativeLayout.BELOW, TITLE_VIEW_ID) - ) - addRule(RelativeLayout.CENTER_VERTICAL) - addRule(RelativeLayout.ALIGN_PARENT_RIGHT) + leftMargin = DimensionUtils.dpToPx(DEFAULT_MARGIN_LEFT) + rightMargin = DimensionUtils.dpToPx(DEFAULT_MARGIN_RIGHT) + } else { + addRule(RelativeLayout.BELOW, TITLE_VIEW_ID) + addRule(RelativeLayout.ALIGN_LEFT, TITLE_VIEW_ID) + + + rightMargin = DimensionUtils.dpToPx(DEFAULT_MARGIN_RIGHT) + bottomMargin = DimensionUtils.dpToPx(DEFAULT_MARGIN_BOTTOM) + } + }) + layout.addView(titleView, RelativeLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT).apply { + leftMargin = DimensionUtils.dpToPx(DEFAULT_MARGIN_LEFT) }) - layout.addView(titleView, titleLayoutParams) layout } diff --git a/androidform/src/main/java/com/github/androiddevfr/form/section/Section.kt b/androidform/src/main/java/com/github/androiddevfr/form/section/Section.kt index d93e5a2..94d6438 100644 --- a/androidform/src/main/java/com/github/androiddevfr/form/section/Section.kt +++ b/androidform/src/main/java/com/github/androiddevfr/form/section/Section.kt @@ -104,18 +104,32 @@ class Section(private val context: Context, var title: String) { } /** - * Add a single/multi choice row) + * Add a row with title/placeholder and a Spinner * * ---------------------------------------- - * | TITLE | - * | (icon) DATE | -> Open Date Picker - * | PLACEHOLDER | + * | TITLE | + * | | + * | ----------------------- | + * | (icon) | default v | | + * | ----------------------- | * ---------------------------------------- */ + fun selection(block: (SelectionRow.() -> Unit)): Section { + return row(SelectionRow(context), block) + } + + /** + * Add a multi choice row + * TODO schema + */ fun multiChoice(block: (MultiChoiceRow.() -> Unit)): Section { return row(MultiChoiceRow(context), block) } + /** + * Add a single choice row + * TODO schema + */ fun singleChoice(block: (SingleChoiceRow.() -> Unit)): Section { return row(SingleChoiceRow(context), block) } diff --git a/sample-kt/src/main/java/com/github/androiddevfr/form/kotlin/sample/MainActivity.kt b/sample-kt/src/main/java/com/github/androiddevfr/form/kotlin/sample/MainActivity.kt index 6e4dbc9..36e05f1 100644 --- a/sample-kt/src/main/java/com/github/androiddevfr/form/kotlin/sample/MainActivity.kt +++ b/sample-kt/src/main/java/com/github/androiddevfr/form/kotlin/sample/MainActivity.kt @@ -42,7 +42,7 @@ class MainActivity : AppCompatActivity() { placeholder = "020202020202" } emailRow { - id = 3 + id = 4 title = "Email Row" placeholder = "android@gmail.com" } @@ -50,33 +50,42 @@ class MainActivity : AppCompatActivity() { section("Section2") { id = 1 dateRow { - id = 5 + id = 15 title = "Date Row" defaultDate = Date() value = Date() } singleChoice { - id = 6 + id = 16 title = "Single Choice" items = listOf("Item 0", "Item 1", "Item 2") + defaultChecked = "Item 1" } multiChoice { - id = 6 + id = 17 title = "Multi Choice" items = listOf("Item 0", "Item 1", "Item 2") + defaultChecked = listOf("Item 0", "Item 2") } } section("Section 3") { - id = 6 + id = 36 seekBarRow { - id = 7 + id = 37 title = "Slider row" maxValue = 42 value = 33 } + + selection { + id = 38 + title = "Please choose a country" + items = listOf("France", "England", "Spain") + defaultItem = "England" + } } }