拦截每个被充气的视图元素?

时间:2017-02-14 20:50:29

标签: java android view kotlin layout-inflater

我试图截取我的活动中正在膨胀的每个视图窗口小部件,并覆盖该视图的setText功能(如果存在)。

因此,如果TextView有一个android:text =" bla"在XML布局中,我希望能够拦截它,并且可能在从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
}
}

1 个答案:

答案 0 :(得分: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之后添加一个,因为我需要这样做。 m使用kotlin和父视图可以为null :)

快乐编程

可以找到好的参考资料here