欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2022-03-28 17:56:34
学习Android基础知识第三天(四种基本布局和自定义控件)一.LinearLayout布局的 介绍和使用LinearLayout布局称为线性的布局,是一种非常常用的布局,这个布局会将包含它的所有控件在线性方向上一次排列,其中Android:orientation属性指定排列的方向vertical,如果指定是horizontal,控件就会在水平方向排列.android:layout_gravity 属性和android:gravity属性的异同Android:layout_gravity属性,它和...

学习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);
	}
}

本文地址:https://blog.csdn.net/DZMNLFH/article/details/107387406