TextView
用于显示文本信息。
属性名称 | 功能描述 |
---|---|
android:layout_width | 控件宽度 |
android:layout_height | 控件高度 |
android:id | 控件唯一标识 |
android:background | 设置TextView控件背景 |
android:layout_margin | 设置控件与屏幕边界或周围控件、布局的距离 |
android:padding | 设置TextView控件与该控件中内容的距离 |
android:text | 设置文本内容 |
android:textColor | 设置文字显示的颜色 |
android:textSize | 设置文字大小,推荐单位为sp |
android:gravity | 设置文本内容的位置 |
android:maxLength | 设置文本最大长度 |
android:lines | 设置文本行数 |
android:maxLines | 设置文本的最大行数 |
android:ellipsize | 设置当文本超出TextView规定范围的显示方式 “start”、“middle”、“end” |
android:drawableTop | 在文本的顶部显示图像,该图像资源可以放在res/drawable相应分辨率目录下,通过"@drawable/文件名"调用 类似属性android:drawableBottom、android:drawableLeft、android:drawableRight |
android:lineSpacingExtra | 设置文本的行间距 |
android:textStyle | 设置文本样式 “bold”、“italic”、“normal” |
控件每个XML属性都对应一个Java方法
在activity_main.xml
定义Button1、2、3属性
<LinearLayout 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:orientation="vertical"
xmlns:app="http://schemas.android.com/apk/res-auto">
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="按钮1"/>
<Button
android:id="@+id/button2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="Button2Click"
android:text="按钮2"/>
<Button
android:id="@+id/button3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:text="按钮3"/>
LinearLayout>
在MainActivity.java
设置Button
点击事件的三种方式
package com.milk.demo2app;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
Button button1;
Button button2;
Button button3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button1=(Button)findViewById(R.id.button1);
button2=(Button)findViewById(R.id.button2);
button3=(Button)findViewById(R.id.button3);
//设置Button1点击事件
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
button1.setText("已点击button1");
}
});
button3.setOnClickListener(this);//设置Button3点击事件
}
//设置Button2点击事件
public void Button2Click(View view){
button2.setText("已点击Button2Click");
}
//设置Button3点击事件
@Override
public void onClick(View view) {
switch(view.getId()){
case R.id.button3:
button3.setText("已点击Button3");
break;
}
}
}
EditText
是TextView
的子类,可以使用TextView
控件的属性
属性名称 | 功能描述 |
---|---|
android:hint | 控件中内容为空时显示的提示文本信息 |
android:textColorHint | 控件中内容为空时显示的提示文本信息的颜色 |
android:password | 输入文本框中的内容显示为"." |
android:phoneNumber | 设置输入文本框中的内容只能是数字 |
android:scrollHorizontally | 设置文本信息超出EditText的宽度情况下是否出现横拉条 |
android:editable | 设置是否可编辑 |
<LinearLayout 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:orientation="vertical"
xmlns:app="http://schemas.android.com/apk/res-auto">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="姓名:"
android:textSize="23sp"
android:textColor="#bbccff"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入姓名"
android:textColor="#bbccff"
android:textColorHint="#66ccff"
android:textSize="23sp"
android:maxLines="2"
android:textStyle="italic"/>
LinearLayout>
删掉EditText底线:android:background=“@null”
设置EditText高度行数:android: MaxLines
设置EditText右侧竖直滚轴:android:scrollbars=“vertical”
ImageView
继承自View
,可以加载各种图片资源
属性名称 | 功能描述 |
---|---|
android:layout_width | 设置ImageView宽度 |
android:layout_height | 设置ImageView高度 |
android:id | 设置ImageView唯一标识 |
android:background | 设置ImageView背景 |
android:layout_margin | 设置当前控件与屏幕边界或周围控件的距离 |
android:src | 设置ImageView控件需要显示的图片资源 |
android:scaleType | 将图片资源缩放或移动以适应ImageView控件的宽高 |
android:tint | 将图片渲染为指定颜色 |
android:adjustViewBounds | 调整ImageView的边界,使得ImageView和图片有一样的长宽比例 当ImageView的宽高都是固定值的时候,adjustViewBounds属性无效 当ImageView的宽高都设置为wrap_content的情况,adjustViewBounds也是无效的 |
scaleType属性 | 功能描述 |
---|---|
center | 按图片的原来size居中显示,当图片长/宽超过View的长/宽,则截取图片的居中部分显示 |
centerCrop | 按比例扩大图片的size居中显示,使得图片长(宽)等于或大于View的长(宽) |
centerInside | 将图片的内容完整居中显示,通过按比例缩小或原来的size使得图片长/宽等于或小于View的长/宽 |
fitCenter | 把图片按比例扩大/缩小到View的宽度,居中显示 |
fitEnd | 把图片按比例扩大/缩小到View的宽度,显示在View的下部分位置 |
fitStart | 把图片按比例扩大/缩小到View的宽度,显示在View的上部分位置 |
fitXY | 把图片不按比例扩大/缩小到View的大小显示 |
matrix | 用矩阵来绘制,动态缩小放大图片来显示。 |
涉及ImageView 、Button 点击事件、FrameLayout 和LinearLayout 嵌套布局与weight 权重设置的简单项目 |
|
java文件 |
package com.milk.teseapp2;
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
public class MainActivity extends AppCompatActivity {
Button Button1,Button2,Button3;
ImageView BackGroundImage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BackGroundImage=(ImageView)findViewById(R.id.BackGroundImage);
Button1=(Button)findViewById(R.id.Button1);
Button2=(Button)findViewById(R.id.Button2);
Button3=(Button)findViewById(R.id.Button3);
Button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Button1.setText("Button1Click");
BackGroundImage.setImageResource(R.drawable.backgroundimage1);
}
});
Button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Button2.setText("Button2Click");
BackGroundImage.setImageResource(R.drawable.backgroundimage2);
}
});
Button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Button3.setText("Button3Click");
BackGroundImage.setImageResource(R.drawable.backgroundimage3);
}
});
}
}
xml文件
<FrameLayout 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:orientation="vertical"
xmlns:app="http://schemas.android.com/apk/res-auto">
<ImageView
android:id="@+id/BackGroundImage"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:scaleType="centerCrop"
>ImageView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/Button1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="600dp"
android:layout_marginRight="20dp"
android:layout_marginLeft="20dp"
android:layout_weight="1"
android:text="Button1"/>
<Button
android:id="@+id/Button2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="600dp"
android:layout_marginRight="20dp"
android:layout_marginLeft="20dp"
android:text="Button2"
android:layout_weight="1"/>
<Button
android:id="@+id/Button3"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="600dp"
android:layout_marginRight="20dp"
android:layout_marginLeft="20dp"
android:text="Button3"
android:layout_weight="1"/>
LinearLayout>
FrameLayout>
RadioButton
表示单选按钮,它是Button
的子类。每个单选按钮由android:checked
属性指定”选中“(True)和“未选中”(False)两种状态
RadioButton
与RadioGroup
配合使用,实现RadioButton
的单选功能。RadioGroup
是单选组合框,可容纳多个RadioButton
,但RadioButton
中不会出现多个RadioButton
同时选中。
XML文件中RadioGroup
和RadioButton
配合使用语法格式:
<RadioGroup
android:属性名称="属性值"
......>
<RadioButton
android:属性名称="属性值"
....../>
......
<RadioGroup/>
使用setOnCheckedChangeListener()
方法为RadioGroup
设置监听布局内控件状态是否改变的事件,通过事件返回的onCheckedChanged()
方法获取被点击的控件ID
使用RadioGroup
、RadioButton
和TextView
,用TextView
显示被选中RadioButton
的内容
java文件
package com.milk.teseapp2;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.RadioGroup;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
RadioGroup radioGroup;
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
radioGroup=(RadioGroup)findViewById(R.id.radiogroup);
textView=(TextView)findViewById(R.id.textview);
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup radioGroup, int i) {
if(i==R.id.radiobutton1){
textView.setText("男");
}
if(i==R.id.radiobutton2){
textView.setText("女");
}
}
});
}
}
xml文件
<LinearLayout 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:orientation="vertical"
xmlns:app="http://schemas.android.com/apk/res-auto">
<RadioGroup
android:id="@+id/radiogroup"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<RadioButton
android:id="@+id/radiobutton1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="男" />
<RadioButton
android:id="@+id/radiobutton2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="女" />
RadioGroup>
<TextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:text="无"
android:layout_height="wrap_content">TextView>
LinearLayout>
CheckBox
表示复选框,是Button
子类,用于实现多选功能。每个复选框由android:checked
属性指定”选中“(True)和“未选中”(False)属性指定”选中“(True)和“未选中”(False)两种状态
Toast
是Android系统提供的轻量级信息提醒机制,用于向用户提示即时消息。
使用Toast
显示提示信息的示例代码:
Toast.makeText(Context,text,Time).show();
Toast.makeText(Activity_Sign.this, "请填写账号", Toast.LENGTH_SHORT).show();
Context
表示应用程序环境的信息,即当前组件的上下文环境。如果在Activity中使用Toast提示信息,那么该参数设置为”当前Activity.this”
Text:表示提示的字符串信息
Time:表示显示信息的时长,包括Toast.LENGTH_LONG
和Toast.LENGTH_SHORT
,分别表示显示较短时间和较长时间
属性名称 | 功能描述 |
---|---|
android:dropDownHorizontalOffset | 设置列表框的水平偏移距离 |
android:dropDownVerticalOffset | 设置列表框的水平竖直距离 |
android:dropDownSelector | 列表框被选中时的背景 |
android:dropDownWidth | 设置下拉列表框的宽度 |
android:gravity | 设置里面组件的对其方式 |
android:popupBackground | 设置列表框的背景 |
android:prompt | 设置对话框模式的列表框的提示信息(标题),只能够引用string.xml 中的资源id,而不能直接写字符串,但可以在java代码中动态设置 |
android:spinnerMode | 列表框的模式,有两个可选值: dialog:对话框风格的窗口 dropdown:下拉菜单风格的窗口(默认) |
android:entries | 可选,使用数组资源设置下拉列表框的列表项目 |
AlertDialog对话框用于提示一些重要信息或者显示一些需要用户额外交互的内容。
使用AlertDialog
创建对话框一般包括标题、内容和按钮三个区域。
创建AlterDialog
对话框步骤
AlertDialog.Builder
创建Alter.Builder
对象AlertDialog.builder
的setTitle()
和setIcon()
方法Alter.Builder
的setMessage()
、setSingleChoiceItems()
或setMultiChoiceItems()
方法设置对话框内容为简单文本、单选列表或多选列表setPositiveButton()
和setNegativeButton()
方法设置对话框的确定和取消按钮AlertDialog.builder
的creat()
方法创建对象AlterDialog
对象的show()
显示对话框AlertDialog
对象的dismiss()
方法取消对话框java文件
package com.milk.teseapp2;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.content.DialogInterface;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//重写onBackPressed()方法来监听回退键
@Override
public void onBackPressed(){
//声明对象
AlertDialog alertDialog;
AlertDialog.Builder adBuilder = new AlertDialog.Builder(this)
.setTitle("普通对话框")//设置对话框标题
.setIcon(R.mipmap.exit)//设置对话框图标
.setMessage("是否退出应用")//设置对话框提示信息
//添加确认按钮
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
MainActivity.this.finish();
}
})
//添加取消按钮
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
}
});
alertDialog = adBuilder.create();
alertDialog.show();
}
}
java文件
package com.milk.teseapp2;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
TextView textView;
Button button;
int TextSizeChoose=1;
int[] TextSizeArr={10,20,30,40};//字体大小选项对应数值
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView=(TextView)findViewById(R.id.textview);
button=(Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
//监听button的click事件
@Override
public void onClick(View view) {
//声明对象
AlertDialog alertDialog;
AlertDialog.Builder adBuilder =new AlertDialog.Builder(MainActivity.this)
.setTitle("更改字体大小")//设置对话框标题
.setIcon(R.mipmap.exit)//设置对话框图标
//设置对话框单选列表
.setSingleChoiceItems(new String[]{"小","中","大","超大"},TextSizeChoose,new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
TextSizeChoose=i;
}
})
//添加确认按钮
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
textView.setTextSize(TextSizeArr[TextSizeChoose]);
}
})
//添加取消按钮
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
}
});
alertDialog =adBuilder.create();
alertDialog.show();
}
});
}
}
xml文件
<LinearLayout 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:orientation="vertical"
xmlns:app="http://schemas.android.com/apk/res-auto">
<TextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:textSize="32sp"
android:text="单选对话框"
android:layout_gravity="center"
android:layout_height="wrap_content" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="设置字体大小">Button>
LinearLayout >
java文件
package com.milk.teseapp2;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
TextView textView;
Button button;
boolean[] checkedItems=new boolean[]{false,false,false,false};
CharSequence[] charSequence=new CharSequence[]{"旅游", "美食", "看电影", "运动"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView=(TextView)findViewById(R.id.textview);
button=(Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
AlertDialog alertDialog;
AlertDialog.Builder adBuilder =new AlertDialog.Builder(MainActivity.this)
.setTitle("选择兴趣")//设置对话框标题
.setIcon(R.mipmap.exit)//设置对话框图标
//设置对话框复选列表
.setMultiChoiceItems(charSequence, checkedItems, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i, boolean isClick) {
checkedItems[i]=isClick;
}
})
//添加确认按钮
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
StringBuffer text=new StringBuffer();
for(int ii=0;ii<checkedItems.length;ii++){
if(checkedItems[ii]) {
text.append(charSequence[ii]).append(".");
}
}
textView.setText(text);
}
})
//添加取消按钮
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
}
});
alertDialog =adBuilder.create();
alertDialog.show();
}
});
}
}
CommonDialog.java
package com.milk.teseapp2;
import android.app.AlertDialog;
import android.content.Context;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.annotation.NonNull;
public class CommonDialog extends AlertDialog {
private TextView messageTv;//显示消息
private TextView titleTv;//显示标题
private Button negtiveBn,positiveBn;//确认和取消按钮
private String message;//消息字符串
private String title;//标题字符串
private String negtive,positive;//确认和取消字符串
public OnClickBottomListener onClickBottomListener;
protected CommonDialog(@NonNull Context context) {//AlterDialog接口
super(context);
}
public CommonDialog setOnClickBottomListener(OnClickBottomListener onClickBottomListener){
this.onClickBottomListener=onClickBottomListener;
return this;
}
public CommonDialog setMessage(String message){
this.message=message;
return this;
}
public CommonDialog setTitle(String title){
this.title=title;
return this;
}
public CommonDialog setPositive(String positive){
this.positive=positive;
return this;
}public CommonDialog setNegtive(String negtive){
this.negtive=negtive;
return this;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.custom_dialog);
initView();
initEvent();
}
private void initView(){
negtiveBn=(Button)findViewById(R.id.Negtive);
positiveBn=(Button)findViewById(R.id.Positive);
titleTv=(TextView)findViewById(R.id.Title);
messageTv=(TextView)findViewById(R.id.Message);
}
private void refreshView(){
if(!TextUtils.isEmpty(title)){
titleTv.setText(title);
titleTv.setVisibility(View.VISIBLE);//设置控件可视
}
else{
titleTv.setVisibility(View.GONE);//设置控件不可视
}
if(!TextUtils.isEmpty(message)){
messageTv.setText(message);
}
if(!TextUtils.isEmpty(positive)){
positiveBn.setText(positive);
}
else{
positiveBn.setText("确认");
}
if(!TextUtils.isEmpty(negtive)){
negtiveBn.setText(negtive);
}
else{
negtiveBn.setText("取消");
}
}
private void initEvent(){
positiveBn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(onClickBottomListener!=null){
onClickBottomListener.onPositiveClick();
}
}
});
negtiveBn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(onClickBottomListener!=null){
onClickBottomListener.onNegtiveClick();
}
}
});
}
@Override
public void show(){
super.show();
refreshView();
}
public interface OnClickBottomListener{
void onPositiveClick();
void onNegtiveClick();
}
custom_dialog.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/Title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:padding="20dp"/>
<TextView
android:id="@+id/Message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:padding="20dp"/>
<View
android:layout_width="match_parent"
android:layout_height="2px"
android:background="#E8E8E8"/>
LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<Button
android:id="@+id/Negtive"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:textColor="#999999"
android:background="@color/black"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:layout_weight="1"/>
<View
android:layout_width="2px"
android:layout_height="match_parent"
android:background="#E8E8E8"/>
<Button
android:id="@+id/Positive"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:textColor="#999999"
android:background="@color/black"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:layout_weight="1"/>
LinearLayout>
LinearLayout>
acitvity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_gravity="center_vertical"
xmlns:app="http://schemas.android.com/apk/res-auto">
<Button
android:id="@+id/CustomButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="弹出自定义对话框">Button>
LinearLayout >
ListView常用属性
属性名称 | 功能描述 |
---|---|
android:listSelector | 当条目被点击后,改变条目的背景颜色 |
android:divider | 设置分割线的颜色 |
android:dividerHeight | 设置分割线的高度 |
android:scrollbars | 是否显示滚动条 |
android:fadingEdge | 去掉上边和下边的黑色阴影 |
BaseAdapter是一个抽象类
方法名称 | 功能描述 |
---|---|
public int getCount() | 获取Item条目的总数 |
public Object getItemId(int position) | 根据position(位置)获取某个Item的对象 |
public long getItemId(int position) | 根据position(位置)获取某个Item的id |
public View getView(int position,View convertView, ViewGroup parent) | 获取相应position对应的Item视图,position是当前Item的位置,convertView用于复用旧视图,parent用于加载xml布局 |
SimpleAdapter继承自BaseAdapter,实现了BaseAdapter的四个抽象方法。
SimpleAdapter构造方法:
public SimpleAdapter(Context, List<? extends Map<String, ?>>data, int resource, String[] from, int[] to);
ArrayAdapter是BaseAdapter的子类,通常用于适配TextView控件。
ArrayAdapter构造方法:
public ArrayAdapter(Context context, int resoure);
public ArrayAdapter(Context context, int resource, int textViewResourceId);
public ArrayAdapter(Context context, int resource, int textViewResourceId,T[] objects);
public ArrayAdapter(Context context, int resource, List<T> objects);
public ArrayAdapter(Context context, int resource, int textViewResourceId, List<T> objexts);
package com.milk.listview;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends Activity {
private ListView mListView;
private final String[] titles={"桌子","苹果","蛋糕","毛衣","猕猴桃","围巾"};//定义项目标题
private final String[] prices ={"1800","10/g","300","350","10/kg","280"};//定义项目价格
private final int[] icon={R.drawable.book,R.drawable.book,R.drawable.book,
R.drawable.book,R.drawable.book,R.drawable.book};//定义项目图标,没有素材,全部用一个图片代替
protected void onCreate(Bundle saveInstanceState){
super.onCreate(saveInstanceState);
//如果先findViewById()再setContentView()程序会闪退
setContentView(R.layout.activity_main);
mListView=(ListView)findViewById(R.id.lv);
MyBaseAdapter mAdapter=new MyBaseAdapter();
mListView.setAdapter(mAdapter);//程序在添加适配器处闪退
}
class MyBaseAdapter extends BaseAdapter {
@Override
public int getCount() {//获得item总数
return titles.length;
}
@Override
public Object getItem(int i) {//获得ListView Item条目总数
return titles[i];
}
@Override
public long getItemId(int i) {//返回Item的Id
return i;
}
@Override
public View getView(int position, View convertView, ViewGroup viewGroup) {//得到Item的视图
//在此处加载list_item.xml布局文件
@SuppressLint("ViewHolder") View view =View.inflate(MainActivity.this,R.layout.list_item,null);
//inflate用于找主布局之外需要用程序修改view组件的布局文件,因此要注意下面的findViewById要通过view调用
TextView title=(TextView)view.findViewById(R.id.title);
TextView price=(TextView)view.findViewById(R.id.price);
ImageView iv=(ImageView) view.findViewById(R.id.iv);
title.setText(titles[position]);
price.setText(prices[position]);
iv.setBackgroundResource(icon[position]);
return view;
}
}
}
list_item.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/iv"
android:layout_width="120dp"
android:layout_height="90dp"
android:layout_centerVertical="true">
ImageView>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_toRightOf="@id/iv"
android:layout_centerVertical="true">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/title"
android:text="桌子"
android:textSize="20sp">
TextView>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tv_price"
android:layout_below="@id/title"
android:textSize="20sp"
android:layout_marginTop="10dp"
android:text="价格">
TextView>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/price"
android:layout_below="@id/title"
android:layout_toRightOf="@id/tv_price"
android:text="1000"
android:textSize="20sp"
android:layout_marginTop="10dp">
TextView>
RelativeLayout>
RelativeLayout>
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="45dp"
android:text="购物平台"
android:textSize="18sp"
android:gravity="center">
TextView>
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="wrap_content">
ListView>
LinearLayout>
在Android5.0之后谷歌提供了用于在有限的窗口范围内显示大量数据的控件RecyclerView。与ListView控件相似,RecyclerView控件同样是以列表的形式展示数据,并且数据是通过适配器加载的。但RecyclerView功能更加强大。
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/Query_Recycler"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
MainActivity
contentList=new ArrayList<>();
dateList=new ArrayList<>();
userNameList=new ArrayList<>();
timeList=new ArrayList<>();
//假设已有完整的数据集
recyclerView.setAdapter(new Overrider_RecyclerAdopt(dateList,timeList,userNameList,contentList));
LinearLayoutManager layoutManager = new LinearLayoutManager(MainActivity.this);
recyclerView.setLayoutManager(layoutManager);
Overrider_RecyclerAdopt.java
package god.drinkjava.fornbr;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
public class Overrider_RecyclerAdopt extends RecyclerView.Adapter<Overrider_RecyclerAdopt.VH> {
//创建item每个组件对应数据列表
private List<String> mDateStringList,mTimeStringList,mUserNameStringList,mContentList;
public Overrider_RecyclerAdopt(List<String> dateList,List<String>timeList,List<String>userList,List<String>contentList){
mDateStringList=dateList;
mTimeStringList=timeList;
mContentList=contentList;
mUserNameStringList=userList;
}
@NonNull
@Override
public VH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//标准格式
//此处需要填入一个R.layout.recycler_item布局
//如果填错也不会显示正确内容
View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item,parent,false);
return new VH(v);
}
//加载每个item数据
@Override
public void onBindViewHolder(@NonNull VH holder, int position) {
holder.contentText.setText(mContentList.get(position));
holder.timeText.setText(mTimeStringList.get(position));
holder.dateText.setText(mDateStringList.get(position));
holder.userNameText.setText(mUserNameStringList.get(position));
}
//必须要返回有效数字,返回多少值显示多少个item
@Override
public int getItemCount() {
return mContentList.size();
}
//item
class VH extends RecyclerView.ViewHolder{
private TextView timeText;
private TextView dateText;
private TextView userNameText;
private TextView contentText;
public VH(@NonNull View itemView) {
super(itemView);
timeText=itemView.findViewById(R.id.TimeText);
dateText=itemView.findViewById(R.id.DateText);
userNameText=itemView.findViewById(R.id.UserNameText);
userNameText.setTextColor(Color.BLACK);
contentText=itemView.findViewById(R.id.ContentText);
}
}
}
最简单的自定义View是创建继承自View类或其子类的类,并重写该类构造方法。
public class Customview extends View{
public Customview(Context context){//使用该构造方法创建一个该类对象
super(context);
}
public Customview(Context context, AttributeSet attrs){//使用该构造方法在布局文件中引用自定义的控件
super(context, attrs);
}
}
onMeasure()
onMeasure(int widthMeasureSpec, int heightMeasureSpec)
第一个参数表示获取父容器指定该控件的宽度
第二个参数表示获取父容器指定该控件的高度
参数不仅包含父容器指定的属性值,还包括父容器指定的测量模式。
测量模式:
wrap_content
时使用。虽然这两个参数是父容器指定该控件的宽高,但是该控件还需要通过
setMeasuredDimension(int,int)
方法设置具体的宽高。
onDraw()
onDraw(Canvas canvas)
参数canvas
表示画布。使用Paint类可以在Canvas类中绘制图像。
onLayout()
onLayout(boolean changed, int left, int top, int right, int bottom)
第一个参数表示自定义View的大小和位置是否发生变化,剩下四个参数分别表示子控件与父容器左边、顶部、右边、底部的距离。