【问题标题】:Intercept every view element being inflated?拦截每个被膨胀的视图元素?
【发布时间】: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


【解决方案1】:

经过一段时间对我的解决方案进行故障排除后,我终于设法通过充气机工厂解决方案实现了我想要的。

首先,我创建了一个抽象活动,其中设置了自定义充气机。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    相关资源
    最近更新 更多