通过安卓中<include>标签findViewById时出现的bug及解决方案
这是my_include.xml文件,也就是需要被include的自定义布局文件
里面只是简简单单地摆了个TextView
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/linearLayout" android:orientation="vertical" android:gravity="center" > <TextView android:id="@+id/text" android:text="看到此控件者得永生..." android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
接下来是activity_main.xml文件
其中include了两次my_include.xml布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" tools:context=".MainActivity" > <include android:id="@+id/include1" android:layout_width="wrap_content" layout="@layout/my_include" /> <include android:id="@+id/include2" android:layout_width="wrap_content" layout="@layout/my_include" /> </LinearLayout>
最后是MainActivity.java文件,其中包含了主要代码
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //第一种情况:间接得到文本组件(会得到两个) textView1=(TextView) findViewById(R.id.include1).findViewById(R.id.text); textView2=(TextView) findViewById(R.id.include2).findViewById(R.id.text); //第二种情况:直接得到文本组件 textView3=(TextView) findViewById(R.id.text); //更改textView3的文字 textView3.setText("啦啦啦啦啦啦啦啦啦"); System.out.println("textView1="+textView1); System.out.println("textView2="+textView2); System.out.println("textView3="+textView3); }
并附上打印信息和手机截图
从上图可以看出,textView1与textView3其实是得到的同一个对象
从上图可以看出,通过直接findViewById的方式得到的对象默认为第一个找到的那个对象(这有点像html,虽然同一个页面可以有相同的ID,但是寻找ID时,默认只找到第一个ID就结束了).
因此无法批量操作具有相同ID的控件
结论:通过间接和直接的方式都可以获取include内部的组件,
但是,间接的方式可以获得两个TextView组件,而直接的方式只能获取到第一个TextView.
因此,在同一个xml文件中同时引用多个同一个layout文件时,笔者推荐大家使用间接findViewById的方式获取include内部的组件.
另外,这是笔者第一次写博客,排版很粗糙,还望各位多多包涵,若此文有错误的地方,还望各位指点,谢谢!
相关推荐
huha 2020-10-16
xfcyhades 2020-11-20
sgafdsg 2020-11-04
Michael 2020-11-03
fengyeezju 2020-10-14
ziyexiaoxiao 2020-10-14
业余架构师 2020-10-09
OuNuo0 2020-09-29
moses 2020-09-22
Angelia 2020-09-11
qinxu 2020-09-10
刘炳昭 2020-09-10
Nostalgiachild 2020-09-07
Nostalgiachild 2020-08-17
leavesC 2020-08-14
一青年 2020-08-13
AndroidAiStudy 2020-08-07
ydc0 2020-07-30
绿豆饼 2020-07-28