为什么在Library中无法使用switch-case来实现点击事件的判定??
2017-08-10 12:00
609 查看
最近一直在在接触组件化工程,项目中将每个模块都独立出来,然后Module中的application对这些组件Library做些依赖,然后组装在一起,就成了一个大型的工程了,废话不多说,今天直接进入主题,
步骤1
步骤2
剩余步骤省略…………,毕竟他和application的创建差不多,module创建了,他依旧是application,我们需要将其设置为library
app的R.java文件
library的R.java文件
原来其中存在一个final字段,app的R.java文件因为是application的原因,所以就生成的R文件是常量,而switch中的case判断条件要是常量,所以在library中不能使用switch来判断,因为他生成的R文件不是常量属性!所以在library中要使用if-else的方式对其进行点击事件的具体化
android-studio解释:https://sites.google.com/a/android.com/tools/tips/non-constant-fields
首先,我们先新建一个工程,然后在其中activity_main.xml写下如下代码:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_horizontal" android:orientation="vertical" tools:context="com.leezp.xingyun.noswitch.MainActivity"> <TextView android:id="@+id/app_activity_main_btn1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:text="点我啊——1" android:textSize="20sp"/> <TextView android:id="@+id/app_activity_main_btn2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:text="点我啊——2" android:textSize="20sp"/> <TextView android:id="@+id/app_activity_main_btn3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:text="点我啊——3" android:textSize="20sp"/> <TextView android:id="@+id/app_activity_main_btn4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:text="点我啊——4" android:textSize="20sp"/> <TextView android:id="@+id/app_activity_main_btn5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:text="点我啊——5" android:textSize="20sp"/> </LinearLayout>
然后在MainActivity.java中写入如下代码:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { btn_1 = (TextView) findViewById(R.id.app_activity_main_btn1); btn_2 = (TextView) findViewById(R.id.app_activity_main_btn2); btn_3 = (TextView) findViewById(R.id.app_activity_main_btn3); btn_4 = (TextView) findViewById(R.id.app_activity_main_btn4); btn_5 = (TextView) findViewById(R.id.app_activity_main_btn5); btn_1.setOnClickListener(this); btn_2.setOnClickListener(this); btn_3.setOnClickListener(this); btn_4.setOnClickListener(this); btn_5.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.app_activity_main_btn1: Log.e(TAG, "onClick: "+"你点了我,妍"); break; case R.id.app_activity_main_btn2: Log.e(TAG, "onClick: "+"你点了我,妍妍"); break; case R.id.app_activity_main_btn3: Log.e(TAG, "onClick: "+"你点了我,妍妍妍"); break; case R.id.app_activity_main_btn4: Log.e(TAG, "onClick: "+"你点了我,妍妍妍妍"); break; case R.id.app_activity_main_btn5: Log.e(TAG, "onClick: "+"你点了我,妍妍妍妍妍"); break; default: Log.e(TAG, "onClick: "+"你点错了,那不是我!"); } }
你会发现,尽然没错,对,他就没错,因为他是application,而不是library,然后我们新建一个Module,做上面一样的操作
步骤1
步骤2
剩余步骤省略…………,毕竟他和application的创建差不多,module创建了,他依旧是application,我们需要将其设置为library
第一步,先library中的build.gradle的第一句代码由apply plugin: 'com.android.application'改为apply plugin: 'com.android.library' 第二步,将其中有句applicationId "xxx.xx.xx.xxx"给删除掉,然后给app的module添加library库依赖,重新build,就可以了 当你在library中重复application的操作时,然后你会发现他竟然出错了
具体报如下错:
什么原因呢???我们看一看就知道,将app的R.java文件与library的R.java文件作对比
app的R.java文件
library的R.java文件
原来其中存在一个final字段,app的R.java文件因为是application的原因,所以就生成的R文件是常量,而switch中的case判断条件要是常量,所以在library中不能使用switch来判断,因为他生成的R文件不是常量属性!所以在library中要使用if-else的方式对其进行点击事件的具体化
android-studio解释:https://sites.google.com/a/android.com/tools/tips/non-constant-fields
相关文章推荐
- Android library中为什么不能使用switch-case语句访问资源ID
- PopupWindow中使用GridView无法响应OnItemClickListener点击事件
- C++使用模板类实现任意类型switch和变量case
- 在Android library中不能使用switch-case语句访问资源ID的原因分析及解决方案
- 在Android library中不能使用switch-case语句访问资源ID的原因分析及解决方案
- android 打library 库 不能使用switch/case语句
- 如何使用SendMessage函数实现模拟鼠标点击按钮事件?
- 使用xib 自定义UITableViewCell 按钮无法点击事件
- 使用map实现函数的switch-case
- 使用ClickableSpan轻松实现一段文本中的多个点击事件
- react native中使用react-native-viewpager实现的商品展示添加点击事件
- 为什么有些Office对象的事件无法使用
- 在Android library中不能使用switch-case语句访问资源ID的原因分析及解决方案
- ListView使用自定义适配器的情况下实现适配器的控件点击事件执行Activity界面中的方法
- 使用jQuery 模拟鼠标点击a标签事件 实现定位
- 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。Java实现
- IE使用滤镜后链接无法触发点击、hover等事件
- 对多个Linerlayout设置点击事件,并实现Activity的跳转。(用Switch简化多次设置点击事件的重复代码)
- ListView使用自定义适配器的情况下实现适配器的文本和图标控件点击事件执行Activity界面中的方法
- 使用C++11新特性,实现用字符串作为switch的case子句