五大布局
- Linearlayout – 线性布局
所为线性布局就是直线的排列方式,只有两种方式,横向或纵向。 - RelativeLayout – 相对布局
所为相对布局就是指布局是对应了一个参照物,一般以父级或同级为参照物,比如在父级的中间,或同级的下面。 - FrameLayout – 框架布局
所有添加到这个布局中的视图都以层叠的方式显示。第一个添加的控件被放在最底层,最后一个添加到框架布局中的视图显示在最顶层,上一层的控件会覆盖下一层的控件。 - AbsoluteLayout – 绝对布局
绝对布局就指定屏幕的X,Y坐标来布局,此方法不能跟随屏幕大小而变化,不能适用多种屏幕,所以用得极少。 - TableLayout – 表格布局
表格布局就是把屏幕分成表格样式,这种布局只能在特定的环境下使用,也用得很少。
布局的优化
官方建议布局层次最多10层
- 利用相对布局来减少布局的层次
- 通过属性来优化
- 利用重用布局文件
<include />
- 减少视图层级
<merge />
- 需要时才加载
<ViewStub />
- 利用重用布局文件
ListView控件
ListView需要两个Layout和一个Adapter类配合才能完成工作。
先创建一个ActivityLayout 包含 ListView 控件
<RelativeLayout 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:background="@color/colorBG" tools:context="com.misiling.Android01.ListViewActivity"> <ListView android:id="@+id/list_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/colorWhite" android:layout_marginTop="@dimen/dimenDP_160" android:layout_marginBottom="@dimen/dimenDP_110" android:paddingLeft="@dimen/dimenDP_10" android:paddingRight="@dimen/dimenDP_10" > </ListView> </RelativeLayout>
再创建一个itemLayout,是用来布局ListView每一项。下而的例子只包含了一个TextView
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/item_name_text_view" android:layout_width="match_parent" android:layout_height="@dimen/dimenDP_44" android:textColor="@color/colorBlack" android:textSize="@dimen/textSize_20" android:textStyle="bold" android:gravity="center_vertical" /> </LinearLayout>
再创建一个Adpter类,在getView方式中读取itemLayout配置与TextView绑定并赋值。
public class ListViewAdapter extends BaseAdapter { private Context mContext; private LayoutInflater mLayoutInflater; private String[] itemNames = {"去评分","功能介绍","系统通知","帮助与反馈","检查新版本"}; public ListViewAdapter(Context context) { this.mContext = context; mLayoutInflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public int getCount() { return itemNames.length; } @Override public Object getItem(int position) { return itemNames[position]; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { convertView = mLayoutInflater.inflate(R.layout.item_listview,null); TextView itemNameTextView = (TextView) convertView.findViewById(R.id.item_name_text_view); itemNameTextView.setText(itemNames[position]); return convertView; } }
再在ListView控件所在的Activity类中绑定这个Adapter.
public class ListViewActivity extends AppCompatActivity { ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_listview); listView = (ListView) findViewById(R.id.list_view); ListViewAdapter listViewAdapter = new ListViewAdapter(ListViewActivity.this); listView.setAdapter(listViewAdapter); } }
ListView类找到ListView控制后根据Adapter找到itemLayout布局并赋值然后反回这个View加载到ListView控件里。这样就完成了ListView的展示。
GridView
- 相似之处:
GridView extends AbsListView
ListView extends AbsListView
adapter、数据、点击事件、刷新都一样 - 不同之处:
样式(宫格式)
ScrollView
不是列表的内容区滚动