Android基础-四种基本布局和自定义控件的步骤

学习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.TitleLayout
		android: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() {
	@Override
	public void onClick(View v) {
		((Activity) getContext()).finish();
		}	
	});
	titleEdit.setOnClickListener(new OnClickListener() {
	@Override
	public 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" >
	<ListView
	android: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" };
	@Override
	protected 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" >
	<ImageView
		android:id="@+id/fruit_image"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content" />
	<TextView
		android: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;
	}
	@Override
	public 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>();
	@Override
	protected 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);
	}
}

你可能感兴趣的:(Android控件,Android基础知识,java,android,android,studio,web,app)