学习Android基础知识第三天(四种基本布局和自定义控件)

一.LinearLayout布局的 介绍和使用
LinearLayout布局称为线性的布局,是一种非常常用的布局,这个布局会将包含它的所有控件在线性方向上一次排列,其中Android:orientation属性指定排列的方向vertical,如果指定是horizontal,控件就会在水平方向排列.
android:layout_gravity 属性和android:gravity属性的异同
Android:layout_gravity属性,它和 android:gravity 属性看起来有些相似,这两个属性有什么区别呢?其实从名字上就可以看出,android:gravity 是用于指定文字在控件中的对齐方式,而 android:layout_gravity 是用于指定控件在布局中的对齐方 式 。 android:layout_gravity 的 可 选 值 和 android:gravity 差 不 多 , 但 是 需 要 注 意 , 当LinearLayout 的排列方向是 horizontal 时,只有垂直方向上的对齐方式才会生效,因为此时水平方向上的长度是不固定的,每添加一个控件,水平方向上的长度都会改变,因而无法指定该方向上的对齐方式。同样的道理,当 LinearLayout 的排列方向是 vertical 时,只有水平方向上的对齐方式才会生效.

二.RelativeLayout布局的使用和介绍
RelativeLayout布局称之为相对布局,也是一种非常常用的布局,其属性值非常多
android:layout_alignLeft 表示让一个控件的左边缘和另一个控件的左边缘对齐,android:layout_alignRight 表示让一个控件的右边缘和另一个控件的右边缘对齐,还有 android:layout_alignTop 和 android:layout_alignBottom,道理都是一样的,我就不再多说,这几个属性就留给你自己去尝试一下了。

系统控件不够用,自创建组件
android中所有的控件都继承自View,所有的布局都是直接或间接的继承ViewGroup,View是Android中一种最常用的UI组件,它可以子啊屏幕上绘制一块区域,并能响应这块区域的 各种事情,而ViewGroup则是一种特殊的View,它可以包含很多的View和ViewGroup,是一个用于放置控件和布局的容器.
创建步骤
新建 TitleLayout 继承自 LinearLayout,让它成为我们自定义的标题栏控件,然后重写了 LinearLayout 中的带有两个参数的构造函数,在布局中引入 TitleLayout控件就会调用这个构造函数。然后在构造函数中需要对标题栏布局进行动态加载,这就要借助 LayoutInflater 来实现了。通过 LayoutInflater 的 from()方法可以构建出一个 LayoutInflater对象,然后调用 inflate()方法就可以动态加载一个布局文件,inflate()方法接收两个参数,第一个参数是要加载的布局文件的 id,这里我们传入R.layout.title,第二个参数是给加载好的布局再添加一个父布局,这里我们想要指定为 TitleLayout,于是直接传入 this。代码:

public class TitleLayout extends LinearLayout {public TitleLayout(Context context, AttributeSet attrs) {super(context, attrs);LayoutInflater.from(context).inflate(R.layout.title, this);}}

ctivity_main.xml 中的代码,如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent" ><com.example.uicustomviews.TitleLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"></com.example.uicustomviews.TitleLayout></LinearLayout>

为标题栏中的按钮注册点击事件

public class TitleLayout extends LinearLayout {public TitleLayout(Context context, AttributeSet attrs) {super(context, attrs);LayoutInflater.from(context).inflate(R.layout.title, this);Button titleBack = (Button) findViewById(R.id.title_back);Button titleEdit = (Button) findViewById(R.id.title_edit);titleBack.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {((Activity) getContext()).finish();}});titleEdit.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(getContext(), "You clicked Edit button",Toast.LENGTH_SHORT).show();}});}}

三.ListView的使用和介绍
ListView是Android中最常用,但是最难使用的控件,ListView允许用户通过手指上下滑动的方式将屏幕外的数据滚到屏幕内,同事屏幕上原由的数据则会滚动出屏幕.
新建一个ListView,需要修改Activity_main.xml中的代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent" ><ListViewandroid:id="@+id/list_view"//设置一个ListView的Id,讲宽度和高度设置为match_parent,让ListView占据整个屏幕android:layout_width="match_parent"android:layout_height="match_parent" ></ListView></LinearLayout>

在MainActivity中的代码:

public class MainActivity extends Activity {private String[] data = { "Apple", "Banana", "Orange", "Watermelon","Pear", "Grape", "Pineapple", "Strawberry", "Cherry", "Mango" };@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, data);ListView listView = (ListView) findViewById(R.id.list_view);listView.setAdapter(adapter);}}

四.定制ListView的界面
为了增加页面效果,丰富内容,讲图片放在ListView中显得更加的生动形象,首先我们需创建一个实体类,作为ListView适配器的适配类,新建一个水果类,代码如下:

public class Fruit {private String name;private int imageId;public Fruit(String name, int imageId) {this.name = name;this.imageId = imageId;}public String getName() {return name;}public int getImageId() {return imageId;}}

新建一个子项,指定一个自定义的布局,在layout目录下新建fruit_item.xml代码如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent" ><ImageViewandroid:id="@+id/fruit_image"android:layout_width="wrap_content"android:layout_height="wrap_content" /><TextViewandroid:id="@+id/fruit_name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_marginLeft="10dip" /></LinearLayout>

需要定义一个适配器的,这个适配器继承ArrayAdapter,并将泛型指定为fruit类,新建一个FruitAdapter,代码如下:

public class FruitAdapter extends ArrayAdapter<Fruit> {private int resourceId;public FruitAdapter(Context context, int textViewResourceId,List<Fruit> objects) {super(context, textViewResourceId, objects);resourceId = textViewResourceId;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {Fruit fruit = getItem(position); // 获取当前项的Fruit实例View view = LayoutInflater.from(getContext()).inflate(resourceId, null);ImageView fruitImage = (ImageView) view.findViewById(R.id.fruit_image);TextView fruitName = (TextView) view.findViewById(R.id.fruit_name);fruitImage.setImageResource(fruit.getImageId());fruitName.setText(fruit.getName());return view;}}

FruitAdapter 重写了父类的一组构造函数,用于将上下文、ListView 子项布局的 id 和数
据都传递进来。另外又重写了 getView()方法,这个方法在每个子项被滚动到屏幕内的时候
会被调用。在 getView 方法中,首先通过 getItem()方法得到当前项的 Fruit 实例,然后使用
LayoutInflater 来为这个子项加载我们传入的布局,接着调用 View 的 findViewById()方法分别
获取到 ImageView 和 TextView 的实例,并分别调用它们的 setImageResource()和 setText()方
法来设置显示的图片和文字.这样适配器就完成了.
修改MainActivity中的代码如下:

public class MainActivity extends Activity {private List<Fruit> fruitList = new ArrayList<Fruit>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initFruits(); // 初始化水果数据FruitAdapter adapter = new FruitAdapter(MainActivity.this,R.layout.fruit_item, fruitList);ListView listView = (ListView) findViewById(R.id.list_view);listView.setAdapter(adapter);}//用于初始化Fruit这个类的数据,在Fruit这个类中将构造函数中的水果名字和对应图片的id传入,让后把创建好的对象添加到水果列表中.让后在onCreate()中创建FruitAdapter对象,并将FruitAdapter作为适配器传给ListView.private void initFruits() {Fruit apple = new Fruit("Apple", R.drawable.apple_pic);fruitList.add(apple);Fruit banana = new Fruit("Banana", R.drawable.banana_pic);fruitList.add(banana);Fruit orange = new Fruit("Orange", R.drawable.orange_pic);fruitList.add(orange);Fruit watermelon = new Fruit("Watermelon", R.drawable.watermelon_pic);fruitList.add(watermelon);Fruit pear = new Fruit("Pear", R.drawable.pear_pic);fruitList.add(pear);Fruit grape = new Fruit("Grape", R.drawable.grape_pic);fruitList.add(grape);Fruit pineapple = new Fruit("Pineapple", R.drawable.pineapple_pic);fruitList.add(pineapple);Fruit strawberry = new Fruit("Strawberry", R.drawable.strawberry_pic);fruitList.add(strawberry);Fruit cherry = new Fruit("Cherry", R.drawable.cherry_pic);fruitList.add(cherry);Fruit mango = new Fruit("Mango", R.drawable.mango_pic);fruitList.add(mango);}}

更多相关文章

  1. Android中Debuggable设置问题
  2. Android(安卓)APIDemos 研读之一:android.graphics.Movie
  3. Android小項目之ListView实现论坛管理效果
  4. Android(安卓)内容提供器---创建内容提供器(元素)
  5. Android常用的intent action汇总
  6. Android(安卓)应用程序退出后不在运行列表中显示的方法
  7. 关于 Android(安卓)程序使用 Support Library 属性的几点说明
  8. Android中_TextView属性的XML详解 包括单行显示等等。
  9. Android中的四种布局

随机推荐

  1. Android(安卓)Fragment 详细翻译
  2. Android(安卓)中的MVP模式
  3. 五大手机操作系统
  4. Android自定义ViewPager(一)——自定义Scro
  5. Android(安卓)ImageLoader(Android-Univer
  6. Android(安卓)studio 安装 环境搭建
  7. Android(安卓)判断程序是否是第一次启动
  8. android studio 现有项目集成Phonegap
  9. FFmpeg编程开发笔记 —— Android(安卓)F
  10. 如何实现 Android(安卓)ListView『上拉加