Last active
March 26, 2019 04:08
-
-
Save grndvl1/16b8558fd7da19bd741bfa6072f9226b to your computer and use it in GitHub Desktop.
Custom LinearLayout
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This is how you set up a custom layout in kotlin, with a linearlayout and 3 textviews but these are embedded so a little | |
trick here to get the properties setters and getters needs to be done. May not be the most efficient way but it works | |
attrs.xml | |
<?xml version="1.0" encoding="utf-8"?> | |
<resources> | |
<declare-styleable name="DetailSectionHeaderText"> | |
<attr name="title" format="string" /> | |
<attr name="info" format="string" /> | |
<attr name="details" format="string" /> | |
</declare-styleable> | |
</resources> | |
row_detail_header_with_text.xml | |
<?xml version="1.0" encoding="utf-8"?> | |
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |
android:orientation="vertical" | |
android:layout_width="match_parent" | |
android:layout_height="wrap_content"> | |
<LinearLayout | |
android:id="@+id/ll_activity_detail_section_header" | |
android:layout_width="match_parent" | |
android:layout_height="wrap_content" | |
android:padding="10dp" | |
android:background="@color/colorPrimary" | |
android:orientation="horizontal"> | |
<TextView | |
android:id="@+id/tv_activity_detail_section_header_title" | |
android:layout_width="wrap_content" | |
android:layout_height="wrap_content" | |
android:layout_weight="1" | |
android:text="Title" | |
android:textColor="#ffffff" /> | |
<TextView | |
android:id="@+id/tv_activity_detail_section_header_info" | |
android:layout_width="wrap_content" | |
android:layout_height="wrap_content" | |
android:text="Info: Awesome" | |
android:textColor="#ffffff"/> | |
</LinearLayout> | |
<TextView | |
android:id="@+id/tv_activity_detail_section_header_details" | |
android:layout_width="match_parent" | |
android:layout_height="wrap_content" | |
android:layout_marginStart="16dp" | |
android:layout_marginEnd="16dp"/> | |
</LinearLayout> | |
DetailSectionHeaderText.kt | |
import android.content.Context | |
import android.util.AttributeSet | |
import android.widget.LinearLayout | |
import com.matthewscorp.detail.R | |
import kotlinx.android.synthetic.main.row_detail_header_with_text.view.* | |
class DetailSectionHeaderText(context: Context?, attrs: AttributeSet?) : LinearLayout(context, attrs) { | |
var title: String by Delegates.observable("") { | |
_, _, new -> | |
titleView.text = new | |
invalidate() | |
} | |
var info: String by Delegates.observable("") { | |
_, _, new -> | |
infoView.text = new | |
if (new == "") { | |
infoView.visibility = View.GONE | |
titleView.gravity = Gravity.CENTER_HORIZONTAL | |
} else { | |
infoView.visibility = View.VISIBLE | |
} | |
invalidate() | |
} | |
var detail: String by Delegates.observable("") { | |
_, _, new -> | |
detailView.text = new | |
invalidate() | |
} | |
private lateinit var titleView: TextView | |
private lateinit var infoView: TextView | |
private lateinit var detailView: TextView | |
init { | |
context?.let { | |
inflate(context, R.layout.row_detail_header_text, this) | |
val titleView = tv_activity_detail_section_header_title | |
val infoView = tv_activity_detail_section_header_info | |
val detailView = tv_activity_detail_section_header_details | |
val attributes = context.obtainStyledAttributes(attrs, R.styleable.DetailSectionHeaderText) | |
title = attributes.getString(R.styleable.DetailSectionHeaderText_title) | |
info = attributes.getString(R.styleable.DetailSectionHeaderText_info) | |
detail = attributes.getString(R.styleable.DetailSectionHeaderText_details) | |
attributes.recycle() | |
} | |
} | |
} | |
Because of the title, info and detail vars you are able to set these properties easily by calling in the activity code | |
using kotlinx the id name of the layout. Say you insert the layout and use the id detailview_activity_details_section_one | |
then you would set the properties dynamically in your activity by calling: | |
detailview_activity_details_section_one.title = "Some Title" | |
detailview_activity_details_section_one.info = "Some Info" | |
detailview_activity_details_section_one.detail = "Some Long detail description" | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment