拦截每个被膨胀的视图元素?
Intercept every view element being inflated?
我正在尝试拦截在我的 activity 中膨胀的每个视图小部件,并覆盖该视图的 setText 功能(如果存在)。
因此,如果 TextView 在 XML 布局中有一个 android:text="bla",我希望能够拦截它并可能在所有文本的末尾添加一个 **从 xml.
设置
一种似乎接近我需要的方法是使用自定义布局充气器。
LayoutInflaterCompat.setFactory(layoutInflator, InflatorOnSteriods(this))
并在我的 InflatorOnSteriods 中覆盖 onCreateView,然后拦截那里的所有视图。这种方法似乎根本不起作用。永远不会调用 onCreateView。
我也试过使用 cloneInContext
LayoutInflaterCompat.setFactory(layoutInflater.cloneInContext(this), InflatorOnSteriods(this))
但也不走运,也许我的方法是完全错误的我也愿意接受一种不同的方式,我可以拦截所有呈现的视图并具体地在该视图上设置某个属性。确保我将是最后一个更改该视图并确保系统尊重我的更改并且以后不会覆盖它们,这一点非常重要。
更新:
虽然我不认为它相关; InflatorOnSteroids.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
}
}
经过一段时间对我的解决方案进行故障排除后,我终于设法通过充气机工厂解决方案实现了我想要的效果。
首先,我创建了一个摘要 activity,其中设置了自定义充气器。
abstract class SteroidsActivity : AppCompatActivity() {
var mInflater: LayoutInflater? = null
abstract fun getActivityLayout(): Int
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mInflater = layoutInflater?.cloneInContext(this)
LayoutInflaterCompat.setFactory(mInflater, InflaterOnSteroids(this))
setContentView(getActivityLayout())
}
override fun getLayoutInflater(): LayoutInflater? {
return mInflater
}
override fun getSystemService(name: String): Any? {
if (name == LAYOUT_INFLATER_SERVICE) {
if (mInflater == null) {
mInflater = super.getSystemService(name) as LayoutInflater
}
return mInflater
}
return super.getSystemService(name)
}
}
您需要做的第二件事是创建您的自定义充气机工厂
class InflaterOnSteroids(appCompatActivity1: AppCompatActivity) : LayoutInflaterFactory {
override fun onCreateView(parent: View?, name: String, context: Context, attrs: AttributeSet): View? {
//Do stuff here and return a view
return null
}
}
我的代码的问题是它总是因奇怪的错误而崩溃,我无法解决这个错误,直到我意识到我需要在 View 之后添加一个 ? 因为我我正在使用 kotlin,父视图可以为 null :)
快乐编程
可以找到很好的参考 here
我正在尝试拦截在我的 activity 中膨胀的每个视图小部件,并覆盖该视图的 setText 功能(如果存在)。
因此,如果 TextView 在 XML 布局中有一个 android:text="bla",我希望能够拦截它并可能在所有文本的末尾添加一个 **从 xml.
设置一种似乎接近我需要的方法是使用自定义布局充气器。
LayoutInflaterCompat.setFactory(layoutInflator, InflatorOnSteriods(this))
并在我的 InflatorOnSteriods 中覆盖 onCreateView,然后拦截那里的所有视图。这种方法似乎根本不起作用。永远不会调用 onCreateView。
我也试过使用 cloneInContext
LayoutInflaterCompat.setFactory(layoutInflater.cloneInContext(this), InflatorOnSteriods(this))
但也不走运,也许我的方法是完全错误的我也愿意接受一种不同的方式,我可以拦截所有呈现的视图并具体地在该视图上设置某个属性。确保我将是最后一个更改该视图并确保系统尊重我的更改并且以后不会覆盖它们,这一点非常重要。
更新:
虽然我不认为它相关; InflatorOnSteroids.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
}
}
经过一段时间对我的解决方案进行故障排除后,我终于设法通过充气机工厂解决方案实现了我想要的效果。
首先,我创建了一个摘要 activity,其中设置了自定义充气器。
abstract class SteroidsActivity : AppCompatActivity() {
var mInflater: LayoutInflater? = null
abstract fun getActivityLayout(): Int
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mInflater = layoutInflater?.cloneInContext(this)
LayoutInflaterCompat.setFactory(mInflater, InflaterOnSteroids(this))
setContentView(getActivityLayout())
}
override fun getLayoutInflater(): LayoutInflater? {
return mInflater
}
override fun getSystemService(name: String): Any? {
if (name == LAYOUT_INFLATER_SERVICE) {
if (mInflater == null) {
mInflater = super.getSystemService(name) as LayoutInflater
}
return mInflater
}
return super.getSystemService(name)
}
}
您需要做的第二件事是创建您的自定义充气机工厂
class InflaterOnSteroids(appCompatActivity1: AppCompatActivity) : LayoutInflaterFactory {
override fun onCreateView(parent: View?, name: String, context: Context, attrs: AttributeSet): View? {
//Do stuff here and return a view
return null
}
}
我的代码的问题是它总是因奇怪的错误而崩溃,我无法解决这个错误,直到我意识到我需要在 View 之后添加一个 ? 因为我我正在使用 kotlin,父视图可以为 null :)
快乐编程
可以找到很好的参考 here