使用 Kotlin Android Extensions 以编程方式扩展布局
Posted
技术标签:
【中文标题】使用 Kotlin Android Extensions 以编程方式扩展布局【英文标题】:Programmatically inflated layout with Kotlin Android Extensions 【发布时间】:2017-11-28 14:56:33 【问题描述】:我有以下布局:
<?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_
android:layout_
android:orientation="vertical"
android:background="@android:color/white"
android:paddingLeft="20dp"
android:paddingRight="20dp">
<TextView
android:id="@+id/tvErrorTitle"
android:layout_
android:layout_
android:layout_marginTop="10dp"
android:textColor="@android:color/background_dark"
android:textSize="18sp"
/>
<TextView
android:id="@+id/tvErrorDesc"
android:layout_
android:layout_
android:layout_marginTop="30dp"
android:textColor="@android:color/darker_gray"
android:textSize="16sp"
/>
<TextView
android:id="@+id/tvAction"
android:layout_
android:layout_
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 中提取视图。如何在程序膨胀布局中使用它并避免findViewById
?
注意:这个问题完全属于Kotlin Android Extensions,而不是语言本身。
编辑 我都导入了:
import kotlinx.android.synthetic.main.dialog_error.view.*
import kotlinx.android.synthetic.main.dialog_error.*
但 Android Studio 仍然尝试从 R.id 导入,并且无法识别这两个导入。有什么遗漏吗?
【问题讨论】:
避免findViewById
?你什么意思?
@pskink kotlinlang.org/docs/tutorials/android-plugin.html 看这里你会明白的
尝试使用其中一种导入,例如 import kotlinx.android.synthetic.main.dialog_error.*
【参考方案1】:
来自docs you linked:
如果我们想调用 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"
【讨论】:
我现在都导入了: import kotlinx.android.synthetic.main.dialog_error.view.* import kotlinx.android.synthetic.main.dialog_error.* 但是 IDE 并没有这样做。相反,它尝试从 R.id 导入 您是否引用了膨胀的View
上的属性?
是的。我想膨胀一个视图,然后在其中获取视图
可以工作但不理解 u.u 只有在 dialogFragment 中有所不同?因为是习惯?需要导入视图
@nhaarman 如果我有一个错误提示:未解决的参考:R,我该如何放大视图?谢谢!【参考方案2】:
它返回一个膨胀的视图:
layoutInflater.inflate(R.layout.your_layout, null)
看,当你的类从上下文超类扩展时,你可以用这个layoutInflater
替换这个LayoutInflater.from(context)
【讨论】:
这对我有帮助。我按照 DialogFragment 上的官方 android 教程,到了一个 T。我一直在崩溃,错误位于四行,无限重复,似乎植根于 Fragment.getLayoutInflater()。这解决了它。不知道为什么它不在教程中。 (我会对我的问题和这个解决方案提出一个问题,但 SO 是 bs,不会让我再问任何问题。)【参考方案3】:在 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_
android:layout_
android:fillViewport="true"
android:nestedScrollingEnabled="true"
android:visibility="gone">
<LinearLayout
android:id="@+id/linear_denomination"
android:layout_
android:layout_
android:orientation="vertical" />
</ScrollView>
【讨论】:
以上是关于使用 Kotlin Android Extensions 以编程方式扩展布局的主要内容,如果未能解决你的问题,请参考以下文章