《黑马程序员Android移动应用基础教程》学习笔记(3)

Ch3 Android常见界面控件

3.1 简单控件的使用

3.1.1 TextView

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方法

3.1.2 Button

activity_main.xml定义Button1、2、3属性

<?xml version="1.0" encoding="utf-8"?>
<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;
        }
    }
}

3.1.3 EditText

EditTextTextView的子类,可以使用TextView控件的属性

属性名称功能描述
android:hint控件中内容为空时显示的提示文本信息
android:textColorHint控件中内容为空时显示的提示文本信息的颜色
android:password输入文本框中的内容显示为"."
android:phoneNumber设置输入文本框中的内容只能是数字
android:scrollHorizontally设置文本信息超出EditText的宽度情况下是否出现横拉条
android:editable设置是否可编辑
<?xml version="1.0" encoding="utf-8"?>
<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”

3.1.4 ImageView

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用矩阵来绘制,动态缩小放大图片来显示。
涉及ImageViewButton点击事件、FrameLayoutLinearLayout嵌套布局与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文件

<?xml version="1.0" encoding="utf-8"?>
<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>

3.1.5 RadioButton

RadioButton表示单选按钮,它是Button的子类。每个单选按钮由android:checked属性指定”选中“(True)和“未选中”(False)两种状态
RadioButtonRadioGroup配合使用,实现RadioButton的单选功能。RadioGroup是单选组合框,可容纳多个RadioButton,但RadioButton中不会出现多个RadioButton同时选中。
XML文件中RadioGroupRadioButton配合使用语法格式:

<RadioGroup
   android:属性名称="属性值"
   ......>
   <RadioButton
      android:属性名称="属性值"
      ....../>
   ......
<RadioGroup/>

使用setOnCheckedChangeListener()方法为RadioGroup设置监听布局内控件状态是否改变的事件,通过事件返回的onCheckedChanged()方法获取被点击的控件ID

使用RadioGroupRadioButtonTextView,用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文件

<?xml version="1.0" encoding="utf-8"?>
<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>

3.1.6 CheckBox

CheckBox表示复选框,是Button子类,用于实现多选功能。每个复选框由android:checked属性指定”选中“(True)和“未选中”(False)属性指定”选中“(True)和“未选中”(False)两种状态

3.1.7 Toast

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_LONGToast.LENGTH_SHORT,分别表示显示较短时间和较长时间

3.1.8x PagerView

不想写了,下次一定

3.1.9x Spinner

属性名称功能描述
android:dropDownHorizontalOffset设置列表框的水平偏移距离
android:dropDownVerticalOffset设置列表框的水平竖直距离
android:dropDownSelector列表框被选中时的背景
android:dropDownWidth设置下拉列表框的宽度
android:gravity设置里面组件的对其方式
android:popupBackground设置列表框的背景
android:prompt设置对话框模式的列表框的提示信息(标题),只能够引用string.xml 中的资源id,而不能直接写字符串,但可以在java代码中动态设置
android:spinnerMode列表框的模式,有两个可选值: dialog:对话框风格的窗口 dropdown:下拉菜单风格的窗口(默认)
android:entries可选,使用数组资源设置下拉列表框的列表项目
不想写代码示例了,下次一定

3.2 AlertDialog对话框的使用

AlertDialog对话框用于提示一些重要信息或者显示一些需要用户额外交互的内容。

3.2.1 AlertDialog对话框概述

使用AlertDialog创建对话框一般包括标题、内容和按钮三个区域。
创建AlterDialog对话框步骤

  1. 调用AlertDialog.Builder创建Alter.Builder对象
  2. 调用AlertDialog.buildersetTitle()setIcon()方法
  3. 调用Alter.BuildersetMessage()setSingleChoiceItems()setMultiChoiceItems()方法设置对话框内容为简单文本、单选列表或多选列表
  4. 调用·AlertDialog.builder·的setPositiveButton()setNegativeButton()方法设置对话框的确定和取消按钮
  5. 调用AlertDialog.buildercreat()方法创建对象
  6. 调用AlterDialog对象的show()显示对话框
  7. 调用AlertDialog对象的dismiss()方法取消对话框

3.2.2 普通对话框

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();
    }
}

3.2.3 单选对话框

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文件

<?xml version="1.0" encoding="utf-8"?>
<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 >

3.2.4 多选对话框

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();
            }
        });
    }
}

3.2.5 自定义对话框

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

<?xml version="1.0" encoding="utf-8"?>
<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

<?xml version="1.0" encoding="utf-8"?>
<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  >

3.3 ListWiew的使用

3.3.1 ListView控件的简单使用

ListView常用属性

属性名称功能描述
android:listSelector当条目被点击后,改变条目的背景颜色
android:divider设置分割线的颜色
android:dividerHeight设置分割线的高度
android:scrollbars是否显示滚动条
android:fadingEdge去掉上边和下边的黑色阴影

3.3.2 常用数据适配器(Adapter)

1. BaseAdapter

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布局
2. SimpleAdapter

SimpleAdapter继承自BaseAdapter,实现了BaseAdapter的四个抽象方法。
SimpleAdapter构造方法:

public SimpleAdapter(Context, List<? extends Map<String, ?>>data, int resource, String[] from, int[] to);
  • context:上下文对象
  • data:数据集合,data每一项对应ListView控件中条目的数据
  • resource:Item布局的资源id
  • from:Map集合中的key值
  • to:Item布局中对应的硬件
3. ArrayAdapter

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);
  • context:Context上下文对象
  • resource:Item布局的资源id
  • textViewResourceId:Item布局中相应TextView的id
  • T[] object:需要适配的List类型的数据
  • Listobject:需要适配的List类型的数据
    可以通过ListView对象的setAdapter()方法添加适配器。
    MainActivity.java
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

<?xml version="1.0" encoding="utf-8"?>
<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

<?xml version="1.0" encoding="utf-8"?>
<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>

3.4 RecyclerView的使用

在Android5.0之后谷歌提供了用于在有限的窗口范围内显示大量数据的控件RecyclerView。与ListView控件相似,RecyclerView控件同样是以列表的形式展示数据,并且数据是通过适配器加载的。但RecyclerView功能更加强大。

  1. 展示效果
    RecyclerView控件可以通过LayoutManager类实现横向或竖向的列表效果、瀑布效果和GridView效果,而ListView控件只能实现竖直的列表效果。
  2. 适配器
    RecyclerView控件使用的是RecyclerView.Adapter适配器,该适配器将BaseAdapter中的getView()方法拆分为onCreateViewHolder()方法和onBindViewHolder()方法,强制使用ViewHolder类,使代码编写规范化,避免了初学者写的代码性能不佳。
  3. 复用效果
    RecyclerView控件复用Item对象的工作由该控件自己实现,而ListView控件复用Item对象的工作需要开发者通过convertView的setTag()方法和getTag()方法进行操作。
  4. 动画效果
    RecyclerView控件可以通过setItemAnimator()方法为Item添加动画效果,而ListView控件不可以通过该方法为Item添加动画效果。
<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);

        }
    }
}

3.5自定义View

最简单的自定义View是创建继承自View类或其子类的类,并重写该类构造方法。

public class Customview extends View{
    public Customview(Context context){//使用该构造方法创建一个该类对象
        super(context);
    }
    public Customview(Context context, AttributeSet attrs){//使用该构造方法在布局文件中引用自定义的控件
        super(context, attrs);
    }
}
1. 自定义View常用三个方法
  1. onMeasure()
    该方法用于测量尺寸,可以设置控件本身或者子控件的宽高
onMeasure(int widthMeasureSpec, int heightMeasureSpec)

第一个参数表示获取父容器指定该控件的宽度
第二个参数表示获取父容器指定该控件的高度
参数不仅包含父容器指定的属性值,还包括父容器指定的测量模式。
测量模式:

  • EXACTLY:当自定义控件的宽高值设置为具体值时使用。
  • AT_MOST:当自定义控件宽高值为wrap_content时使用。
  • UNSPECIFIED:当父容器没有指定自定义控件宽高时使用。

虽然这两个参数是父容器指定该控件的宽高,但是该控件还需要通过setMeasuredDimension(int,int)方法设置具体的宽高。

  1. onDraw()
    该方法用于绘制图像。
 onDraw(Canvas canvas)

参数canvas表示画布。使用Paint类可以在Canvas类中绘制图像。

  1. onLayout()
    该方法用于指定布局中子控件的位置,该方法通常在自定义ViewGroup中重写。
 onLayout(boolean changed, int left, int top, int right, int bottom)

第一个参数表示自定义View的大小和位置是否发生变化,剩下四个参数分别表示子控件与父容器左边、顶部、右边、底部的距离。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值