Android关于getChildCount()方法的一些思考

阶段一:只有一个布局文件
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个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值