我有以下布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@android:color/white"
android:paddingLeft="20dp"
android:paddingRight="20dp">
<TextView
android:id="@+id/tvErrorTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:textColor="@android:color/background_dark"
android:textSize="18sp"
/>
<TextView
android:id="@+id/tvErrorDesc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:textColor="@android:color/darker_gray"
android:textSize="16sp"
/>
<TextView
android:id="@+id/tvAction"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:layout_marginBottom="10dp"
android:layout_gravity="end"
android:padding="5dp"
android:textSize="15sp"
android:textStyle="bold"
android:textAllCaps="true"
android:textColor="@android:color/holo_purple"
/>
</LinearLayout>
当我想在下面的活动之外使用kotlin android extensions时,它不起作用。我最终做了findViewById。
...
...
import kotlinx.android.synthetic.main.dialog_error.*
...
...
val view = LayoutInflater.from(context).inflate(R.layout.dialog_error, null, false)
val tvErrorTitle = view.findViewById(R.id.tvErrorTitle) as TextView
val tvErrorDesc = view.findViewById(R.id.tvErrorDesc) as TextView
val tvErrorAction = view.findViewById(R.id.tvAction) as TextView
它不会直接从xml中提取视图。如何在programetically inflated布局中使用它并避免findViewById
?
注意:此问题严格属于Kotlin Android Extensions,而非语言本身。
修改 我已经导入了两个:
import kotlinx.android.synthetic.main.dialog_error.view.*
import kotlinx.android.synthetic.main.dialog_error.*
但Android Studio仍尝试从R.id导入,并且不会识别这两个导入。有什么遗漏吗?
答案 0 :(得分:28)
如果我们想在View上调用合成属性(在适配器类中有用),我们也应该导入
kotlinx.android.synthetic.main.activity_main.view.*.
也就是说,导入kotlinx.android.synthetic.main.layout.view.*
也可以加载View
扩展名属性。
然后:
val view = LayoutInflater.from(context).inflate(...)
view.tvErrorTitle.text = "test"
答案 1 :(得分:1)
它返回一个放大的视图:
layoutInflater.inflate(R.layout.your_layout, null)
请参见,当您的类从Context超类扩展时,您可以将此LayoutInflater.from(context)
替换为layoutInflater
答案 2 :(得分:1)
在kotlin中,您可以尝试使用数据绑定在线性布局内扩大布局
val inflater: LayoutInflater = LayoutInflater.from(activity).context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
val mBindingDeno: LayoutDenominationBinding =
DataBindingUtil.inflate(
inflater, R.layout.layout_denomination, null, false
)
layout.addView(mBindingDeno.root)
这里的布局是您的LinearLayout
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fillViewport="true"
android:nestedScrollingEnabled="true"
android:visibility="gone">
<LinearLayout
android:id="@+id/linear_denomination"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" />
</ScrollView>