阶段一:只有一个布局文件
acitivity_main.xml 文件下
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/linearyout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.whaley.duchunwei.myapptest.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
MainActivity代码如下:
public class MainActivity extends AppCompatActivity {
private String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LinearLayout layout = (LinearLayout) findViewById(R.id.linear);
Log.i(TAG, "MainActivity共有"+layout.getChildCount()+"子view");
}
}
输出结果: MainActivity共有 3 子view,getChildCount获得的layout布局下的子view数目。
阶段二:
接下来在上面的基础上稍加改动,使其更为复杂
acitivity_main.xml 文件下
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/linear"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.whaley.duchunwei.myapptest.MainActivity">
<com.whaley.duchunwei.myapptest.MainActivityItem
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<com.whaley.duchunwei.myapptest.MainActivityItem
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
activity_main_item.xml文件下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/linearyout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.whaley.duchunwei.myapptest.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
MainActivity文件内容:
public class MainActivity extends AppCompatActivity {
private String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LinearLayout layout = (LinearLayout) findViewById(R.id.linear);
Log.i(TAG, "MainActivity共有"+layout.getChildCount()+"子view");
}
}
MainActivityItem文件内容:
public class MainActivityItem extends LinearLayout{
private String TAG = "MainActivityItem";
public MainActivityItem(Context context) { this(context, null); }
public MainActivityItem(Context context, AttributeSet attrs) { this(context, attrs, 0); }
public MainActivityItem(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
private void init(Context context) {
View rootView = View.inflate(context, R.layout.activity_main_item, this);
LinearLayout linearLayout = (LinearLayout) rootView.findViewById(R.id.linearyout);
Log.i(TAG, "MainActivityItem共有 "+ linearLayout.getChildCount() +" 子view");
}
}
输出结果:
MainActivityItem: MainActivityItem共有 3 子view
MainActivityItem: MainActivityItem共有 3 子view
MainActivity: MainActivity共有 2 子view
这里将 Log.i(TAG, “MainActivityItem共有 “+ linearLayout.getChildCount() +” 子view”);
换成
Log.i(TAG, “MainActivityItem共有 “+ ((ViewGroup)rootView).getChildCount() +” 个item”);
输出结果:
MainActivityItem共有 1 子view
MainActivityItem共有 1 子view
MainActivity共有 2 子view
可以发现返回的结果是不一致的,
View rootView = View.inflate(context, R.layout.activity_main_item, this);这句代码的作用是将布局文件activity_main_item加载进当前view,就是说view就是activity_main_item父布局,而View.inflate(context, R.layout.activity_main_item, this)返回的就是被加载activity_main_item布局文件的父布局(即当前布局),而当前布局里只有activity_main_item一个子view,所以调用 ((ViewGroup)rootView).getChildCount()返回的结果就是1个。
但是在代码里通过 LinearLayout linearLayout = (LinearLayout) rootView.findViewById(R.id.linearyout)得到的是activity_main_item布局文件最外层的LinearLayout布局,显然根据之前给出的
布局文件可以知道LinearLayout有三个子view(即三个TextView),所以当调用 linearLayout.getChildCount()返回的结果就是3个