直接继承CompoundButton接收不到ACTION_UP的原因

直接继承CompoundButton接收不到ACTION_UP的原因前提:由于部门调整,所以我的工作职责变成搭建一个动态特效组件库来供项目部门使用,任务比较庞大。hoho,慢慢来。任务一:一个带动态特效的Switch。任务分解:由于需求特效不能直接继承Switch来做,只能将代码写入到Switch源码中,为了以后调试方便及方便其他人员调试,所以需要将Switch放到eclipse中编译通过,那么,开始吧。遇到问题:1.importandroi

前提:由于部门调整,所以我的工作职责变成 搭建一个动态特效组件库来供项目部门使用,任务比较庞大。hoho,慢慢来。

任务一:一个带动态特效的Switch。

任务分解:由于需求特效不能直接继承Switch来做,只能将代码写入到Switch源码中,为了以后调试方便及方便其他人员调试,所以需要将Switch放到eclipse中编译通过,那么,开始吧。

遇到问题:1. import android.text.method.AllCapsTransformationMethod; 报错

                  2. com.android.internal.R 找不到

解决方法:1. 导入framework.jar可以解决

                  2. 导入layoutlib可以解决报错,但是使用这种方法以后Switch构造函数中TypedArray 、appearance通通为空,获取不到,所以也是失败,想了一些方法也没办法获取得到,因为考虑到工期问题,所以决定将Switch中的图片资源放到Drawable下面,直接获取资源来忽略此问题。等Switch完成以后再来解决这个问题

好了。到了这里,所有已知的问题都解决了。调试过程中发现

public boolean onTouchEvent(MotionEvent ev)

只能接收到ACTION_DOWN事件,不能接收其他事件。想想很奇怪啊。系统的switch组件都可以,为什么我的不可以。唯一的区别就是style啊。看看style代码没有和touch相关的东西啊。。奇怪。。找不到区别,那就只能跟代码了。连上手机,打个断点,找啊找啊。找了两个小时多。找到问题了。。

在viewgroup中

public boolean dispatchTouchEvent(MotionEvent ev) {
if (dispatchTransformedTouchEvent(ev, false, child, idBitsToAssign))
{
mLastTouchDownTime = ev.getDownTime();
mLastTouchDownIndex = childIndex;mLastTouchDownX = ev.getX();
mLastTouchDownY = ev.getY();
newTouchTarget = addTouchTarget(child, idBitsToAssign);
alreadyDispatchedToNewTouchTarget = true;break;
}
}

这个if条件走不进来,导致 mFirstTouchTarget 值一直为空,所以目标无效,继续跟进去这个if条件发现

在view中

public boolean onTouchEvent(MotionEvent event)
if (((viewFlags & CLICKABLE) == CLICKABLE ||(viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE))

这个if条件不满足,返回为false,哦。原来是clickable这个属性值为false。终于找到问题了。但是新的问题是switch为什么可以呢。查找switch的代码没有找到clickable相关了。翻翻CompoundButton。原来在CompoundButton中定义了

<style name="Widget.CompoundButton"><item name="android:focusable">true</item><item name="android:clickable">true</item><item name="android:textAppearance">?android:attr/textAppearance</item><item name="android:textColor">?android:attr/textColorPrimaryDisableOnly</item><item name="android:gravity">center_vertical|start</item>

所以默认就有clickable。问题又出来了。为什么直接继承不行呢?查找如下:

AndroidManifest.xml 中application中默认使用主题

android:theme="@style/AppTheme"

在style.xml中。

<style name="AppTheme" parent="AppBaseTheme">

继续查找下去。真相了:

系统默认的theme.xml中

只定义了如下四种

<item name="checkboxStyle">@android:style/Widget.CompoundButton.CheckBox</item><item name="radioButtonStyle">@android:style/Widget.CompoundButton.RadioButton</item><item name="starStyle">@android:style/Widget.CompoundButton.Star</item><item name="switchStyle">@android:style/Widget.Holo.CompoundButton.Switch</item>

独独没有定义CompoundBotton,所以应用不到CompoundBotton的风格。看来是google是没有考虑到有人会直接继承CompoundButton吗?

 

绕来绕去。完美解决问题2才是正道啊。。

 

 

如有错误,请指正。

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/38287.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注