【发布时间】:2017-02-14 20:50:29
【问题描述】:
我正在尝试拦截在我的活动中膨胀的每个视图小部件,并覆盖该视图的 setText 功能(如果存在)。
因此,如果 TextView 在 XML 布局中有一个 android:text="bla" 我希望能够拦截它,并可能在从 xml 设置的所有文本的末尾添加一个 **。
似乎接近我需要的一种方法是使用自定义布局充气机。
LayoutInflaterCompat.setFactory(layoutInflator, InflatorOnSteriods(this))
在我的 InflatorOnSteriods 中覆盖 onCreateView 然后拦截那里的所有视图.. 这种方法似乎根本不起作用。永远不会调用 onCreateView。
我也尝试使用 cloneInContext
LayoutInflaterCompat.setFactory(layoutInflater.cloneInContext(this), InflatorOnSteriods(this))
但也没有运气,也许我的方法是完全错误的,我也可以采用不同的方式截取所有呈现的视图,并在该视图上具体设置某个属性。确保我是最后一个更改该视图的人,并确保系统尊重我的更改并且以后不会覆盖它们,这一点非常重要。
更新:
虽然我不认为它相关; InflatorOnStroids.kt 代码
class InflatorOnSteriods(val appCompatActivity: AppCompatActivity) : LayoutInflaterFactory {
override fun onCreateView(parent: View, name: String, context: Context, attrs: AttributeSet): View {
var result: View
if (TextUtils.equals(name, "DebugDrawerLayout")) {
result = ImageView(context, attrs)
}
result = appCompatActivity.onCreateView(name, context, attrs)
if (result == null) {
// Get themed views from app compat
result = appCompatActivity.delegate.createView(parent, name, context, attrs)
}
return result
}
}
【问题讨论】:
-
您可以在您的问题中添加
InflatorOnSteriods类代码吗? -
我添加了代码@petey,虽然该类现在在那里什么都不做......所以我不认为这是问题......我的问题更多是即使是正确的方法,因为它可能不会是。
-
"因此,如果 TextView 在 XML 布局中有一个 android:text="bla" 我希望能够拦截它,并可能在从xml。”这是在哪里发生的? (另外,你使用 kotlin 很棒)
-
@petey 你还会用什么;)哈哈。你的意思是这发生在哪里?我的计划是确保我有一个挂钩点,我可以拦截每个包含文本属性的视图,然后操纵该文本。如果我需要进一步澄清这一点,请告诉我。
标签: java android view kotlin layout-inflater