我试图使用我自己的自定义视图,用layout.xml文件填充。我多次使用此视图,但有时它不会在Android Studio中显示预览。当我通过' findViewById'在“活动”中获得此自定义视图时(事实上,我使用Kotlin所以我只是直接写Id。)它总是返回null。 我读了很多关于'自定义视图的问题,findviewById返回null',直到现在我还没有找到答案。我错了什么?
这是我的自定义类
class SubTitleBar(ctx:Context) : RelativeLayout(ctx) {
private val mTitle:TextView
private val mSideBtn:TextView
constructor(ctx: Context, attrs: AttributeSet) : this(ctx) {
val typedArray = context.obtainStyledAttributes(attrs, R.styleable.SubTitleBar)
setAttributeSet(typedArray)
}
constructor(ctx: Context, attrs: AttributeSet, defStyle:Int) : this(ctx, attrs) {
val typedArray = context.obtainStyledAttributes(attrs, R.styleable.SubTitleBar, defStyle, 0)
setAttributeSet(typedArray)
}
init {
val infService = Context.LAYOUT_INFLATER_SERVICE
val inflater = ctx.getSystemService(infService) as LayoutInflater
val view = inflater.inflate(R.layout.cv_subtitle,this,false)
mTitle = view.findViewById(R.id.subtitle_title)
mSideBtn = view.findViewById(R.id.subtitle_btn)
addView(view)
}
private fun setAttributeSet(typedArray: TypedArray) {
val titleText = typedArray.getString(R.styleable.SubTitleBar_title)
mTitle.text = titleText
val btnText = typedArray.getString(R.styleable.SubTitleBar_btnText)
if (btnText!= null && btnText.isNotEmpty()) {
mSideBtn.text = btnText
} else {
mSideBtn.visibility = TextView.GONE
}
val showDivider = typedArray.getBoolean(R.styleable.SubTitleBar_showDivider, false)
if (showDivider) {
subtitle_divider.visibility = View.VISIBLE
}
typedArray.recycle()
}
fun setTitle(title:String) {
mTitle.text = title
}
fun setSideButtonClickListener(listener: (View) -> Unit) = mSideBtn.setOnClickListener(listener)
}
这是cv_subtitle.xml文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="52dp"
android:background="@color/white"
android:orientation="horizontal">
<TextView
android:id="@+id/subtitle_title"
style="@style/SubTitleNormal"
android:paddingStart="@dimen/contentStartPadding"
android:layout_centerVertical="true"
/>
<TextView
android:id="@+id/subtitle_btn"
style="@style/SubTitleSideBtn"
android:layout_alignParentEnd="true"
android:paddingEnd="@dimen/contentEndPadding"
android:layout_centerVertical="true"
/>
<View
android:id="@+id/subtitle_divider"
style="@style/PaddingDividerGray"
android:layout_alignParentBottom="true"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
android:visibility="gone"
/>
</RelativeLayout>
在Fragment布局资源文件中,我这样使用。
<com.sample.harleyquinn.view.SubTitleBar
android:layout_width="match_parent"
android:layout_height="@dimen/subTitleBarSize"
android:id="@+id/my_apt_list_subtitle"
app:title="apt"
app:btnText="edit"
/>
在片段(或活动)中我尝试这样。
val subTitle = my_apt_list_subtitle
我也试过这个,但是没有用。
val subTitle = view.findViewById(R.id.my_apt_list_subtitle)
答案 0 :(得分:0)
您需要将包括id在内的属性传递给超级类型。你必须改变
class SubTitleBar(ctx:Context) : RelativeLayout(ctx) {
到
class SubTitleBar(ctx:Context, attrs: AttributeSet) : RelativeLayout(ctx, attrs) {
并相应地更改其他构造函数。
答案 1 :(得分:-1)
尝试将SubTitleBar包含在cv_subtitle.xml
中