自定义View监听同级View状态

作者: 桥寻 | 来源:发表于2016-08-21 16:23 被阅读264次

需求是这样的:

  1. 需要自定义一个控件来检测EditEext的状态
  1. 在xml中自己写属性,传入EditText的Id
  2. 尽量减少在Activity中的代码量,降低耦合度

难点

  1. 在这之前,不知道属性中可以直接传入id
  1. 拿到id后,无可以findViewById的实例
  2. 获取到的EditText和Activity中的EditText不是同一个实例

首先,我们自定义一个属性,暂且称之为bind_view

![`JMU(MB%@NR0P8RV]W9L9GG.png](https://img.haomeiwen.com/i1949748/3095d06eaa9e286e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

在xml文件中引用,并将我们所需要绑定的EditText的Id传入

![`W5IN}BQR[L%8QK2M0)]V4.png
起初,我是抱着试一试的心态来做这个的,在R文件中,我看到我们所绑定的Edittext的Id如下:

9XTNK0R8HF$6EQ0)VNV{7QP.png

在我们所写的自定义view的构造函数中,获取TypedArray

final TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.TextBindView);

在debug模式下看到,我们传入的id在TypedArray中

![4]V_})Q@4HMIKLVX}_X6CA4.png](https://img.haomeiwen.com/i1949748/4ea3b758aaafa083.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

此时,需求就变得简单了,在尝试了getInt,getType未果之后,我们使用了getResourceId获取到了真正的绑定的EditText的Id

int resId = ta.getResourceId(R.styleable.TextBindView_bind_view, 0);

突然发现,我们所绑定的View不是我们自定义View的子View,而View的findViewById是向下遍历,此时机智的我想到了再定义一个属性

J(PAANH1T0913OHPZB%ZNAK.png

通过这个属性,传入layout,通过layout来findViewById

app:parent_view="@layout/activity_main"

然而,此时发现,在构造函数中是无法View.inflate的,真是个悲伤的故事,通过上网查阅资料,知道这是由于生命周期的缘故,想要inflate,必须在onAttachedToWindow方法中进行,于是我将函数迁移至onAttachedToWindow方法中。

在这里,我们成功的获得了我们所绑定的EditText,并且获取到了text,此时,我想在这里给EditText设置一个textWatcher,事情就大功告成了,结果并不尽如人意。

给Edittext设置textWatcher后,发现改变Edittext的内容没有什么卵用。让我一度怀疑人生了,再使用settext同样没有什么用,仔细思考之后,认为:

通过View.inflate来获取到的ViewRoot,再进行findViewById所得到的View,和我们Activity通过setContentView绘制出的View并不是同一个View。这段话可能有点绕,总的来说就是一句话,setContentView和inflater加载出来的是两个不同的实例。

此时,事情又回到刚开始了,难道真的要在activity给我们所自定义的View添加一个要监听的EditText吗?

秉着没有代码做不到的事情,我上网查阅资料得出:

  • 同一个activity 通过findViewById来获取到的View 永远都是同一个View

  • 第二点也是最重要的一点,View中的context其实是Activity向上转型得到的,我们只需要将其向下转型即可得到当前界面的activity

最终,我们直接根据得到的resId,使用activity.findViewById来获取我们绑定的Edittext。

CB7_SCQ(_0DY}M(%TENE%~X.png

此时,我们终于达成了本次自定义View的最终需求。成功在xml中传入绑定的Id来监听edittext。

![]JRBLCPHN0N_4EN09F)RBH7.png](https://img.haomeiwen.com/i1949748/4415134a060c3fb0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

相关文章

  • 自定义View监听同级View状态

    需求是这样的: 需要自定义一个控件来检测EditEext的状态 在xml中自己写属性,传入EditText的Id ...

  • 手势

    监听触摸事件的做法 touches方法监听view触摸事件的缺点必须要自定义view无法让其他外界对象监听view...

  • 六大操作手势

    使用 touches 方法来监听 view 的触摸事件弊端: 必须得自定义 view, 在自定义的 View 当中...

  • 08-手势识别(点按,长按,轻扫)

    Make by:弓_虽_子 通过touches方法监听view触摸事件的缺点? 1.必须得自定义view,在自定义...

  • 手势识别

    监听触摸事件的做法 如果想监听一个view上面的触摸事件,之前的做法是1.自定义一个view2.实现view的to...

  • 手势

    如果想监听一个view上面的触摸事件,之前的做法是:1、自定义一个view2、实现view的touches方法,在...

  • 手势

    手势识别简单使用 监听触摸事件的做法 如果想监听一个 view 上面的触摸事件,之前的做法是自定义一个 view实...

  • [译]Android 泄露范例: 视图订阅

    原文链接 在Square Register中,我们依赖于自定义View来构建我们的应用程序。有时,View监听某个...

  • 自定义View5---完整的自定义View

    移步自定义View系列 1.自定义view的分类自定义单一view(不含子view)继承view继承特定view如...

  • 自定义View系列

    自定义View1---知识储备自定义View2---View Measure过程自定义View3---View L...

网友评论

    本文标题:自定义View监听同级View状态

    本文链接:https://www.haomeiwen.com/subject/coqwsttx.html