Android中ViewGroup.Params整理总结

本文详细介绍了Android中LayoutParams的作用及使用方法,包括LayoutParams的继承体系、不同LayoutParams的属性差异、自定义ViewGroup时如何支持Margin属性等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.所有以”layout_”开头的属性都是属于LayoutParams或者LayoutParams的子类的,而不属于View的,但是在View绘制的measure或者其他过程中,会解析LayoutParams的属性,这样又影响到了View的绘制;

2.基类LayoutParams是ViewGroup类里的一个静态内部类,只提供了width和height两个属性,对应于xml里的layout_width和layout_height;
3.ViewGroup.MarginLayoutParams继承自ViewGroup.LayoutParams,只是比父类多了
        public int leftMargin;
        public int topMargin;
        public int rightMargin;
        public int bottomMargin;
        private int startMargin;
        private int endMargin;
       几个margin相关的属性。
        注意:在xml布局里,layout_margin属性的值会覆盖layout_marginLeft与layout_marginRight等属性的值。
4.如果自定义ViewGroup时想要支持Margin属性,还要扩展其他属性,那么最好继承并扩展ViewGroup.MarginLayoutParams。
5.为一个View创建LayoutParams的时候,最好创建View对应的父类LayoutViewGroup类型的LayoutParams,例如LinearLayout.LayoutParams,这样就可以得到LinearLayout的宽高、weight、gravity等属性,并进行设置。
   而不要只是创建一个ViewGroup.LayoutParams类型的对象,这样只会有宽高两个属性可用。

   如果确定只用到宽高这两个属性,那么也可以创建ViewGroup.LayoutParams类型的对象,这样不易产生LayoutParams类型不匹配的错误。

6.一般建议,用java添加view时,按照新建View、新建LayoutParams、为View设置LayoutParams、最后ViewGroup.addView(view)的顺序书写代码,这样ViewGroup会进行LayoutParams类型校验避免崩溃;
   如果按照新建View、新建LayoutParams、ViewGroup.addView(view)、最后为View设置LayoutParams的顺序书写代码,那么如果LayoutParams类型不匹配可能出现崩溃。因为最后为View设置LayoutParams完成后,ViewGroup会直接
   重绘刷新视图,不会校验LayoutParams类型,系统会有一步类型强制转换过程,有可能崩溃。

   并且,ViewGroup.addView(view),ViewGroup绘制了一次,然后再为View设置LayoutParams,ViewGroup又绘制了一次,性能较低,虽然系统会对重绘的流程有优化。

7.根据上述1、2、3、4、5条的描述,在java代码中,动态为view设置Params时,要新建该view对应的直接父布局类型的Params(如果只用到了宽高属性,新建ViewGroup.Param类型的也可以)。例如新建的TextView打算发到LinearLayout中,也就是TextView的直接父布局是LinearLayout,那么最好为TextView新建一个LinearLayout.Params对象,然后再为该TextView设置param参数;如果TextView的父布局是LinearLayout类型布局,那么如果为TextView新建的是RelativeLayout.Params类型或者FrameLayout.Params等其他类型的Param,那么有可能会导致程序崩溃(崩溃情况参考上述第6条描述)。

8.参考网址:
   http://blog.youkuaiyun.com/yisizhu/article/details/51582622
编写一个Android应用,其中包含一个列表框(ListView)。列表框应显示一系列项目,例如“项目1”、“项目2”和“项目3”。当列表中的项目被点击时,应显示一个Toast消息,显示被点击项目的文本。 MainActivity.java import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { private ListView listView; private String[] items = {"项目1", "项目2", "项目3"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = findViewById(R.id.my_listview); ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, items); listView.setAdapter(adapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { String item = items[position]; Toast.makeText(MainActivity.this, "你点击了:" + item, Toast.LENGTH_SHORT).show(); } }); } } activity_main.xml <RelativeLayout 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" tools:context=".MainActivity"> <ListView android:id="@+id/my_listview" android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout> 修改建议: 1添加更多列表项到items数组中。 2更改列表项的布局(例如使用自定义的列表项布局)。 3尝试在点击事件中执行其他操作,如导航到另一个Activity或更新UI。 4调整ListView的高度,比如设置为wrap_content或指定具体的dp值。(给出详细步骤)
最新发布
06-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值