11月7日Android学习笔记

标签

Android

Activity

layout

dialog

发布时间:

本文字数:1,200 字 阅读完需:约 7 分钟

自定义控件

title_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/titleviews"
    android:layout_width="match_parent"
    android:layout_height="60dp"
    android:background="@color/purple_200">

    <ImageView
        android:id="@+id/title_iv_left"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_marginLeft="10dp"
        android:src="@mipmap/icon_back"/>
    <ImageView
        android:id="@+id/title_iv_right"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_marginRight="10dp"
        android:layout_alignParentRight="true"
        android:src="@mipmap/icon_setting"/>
    <TextView
        android:id="@+id/title_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="标题"
        android:layout_centerInParent="true"
        android:textSize="20sp"/>

</RelativeLayout>

TitleView.java

package com.xyl.app1105.view;
import android.app.Activity;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.xyl.app1105.R;


/**
 * 作者:animee on 2022/11/5 17:07
 * 接口回调:
 * 当这个类的某项事件由它触发,但是功能不是由它决定,就可以用接口回调解决。
 * 1. 创建接口,编写回调方法
 * 2. 在这个类中,将接口设置为成员变量,然后通过set方法对其进行赋值
 * 3. 在被触发的地方调用这个接口的方法
 */
public class TitleView extends RelativeLayout implements View.OnClickListener {
    ImageView leftIv,rightIv;
    TextView titleTv;
    RelativeLayout layout;

    public interface OnClickImgListener{
        public void onClick(View view);
    }
    OnClickImgListener leftListener, rightListener;
    public void setOnClickLeftImgListener(OnClickImgListener leftListener){
        this.leftListener = leftListener;
    }
    public void setOnClickRightImgListener(OnClickImgListener rightListener){
        this.rightListener = rightListener;
    }

    // 在代码当中创建view对象时,会调用的构造方法
    public TitleView(Context context) {
        this(context,null);
    }
    // 在布局当中写view对象时,会调用的构造方法
    public TitleView(Context context, AttributeSet attrs) {
        super(context, attrs);
        LayoutInflater.from(context).inflate(R.layout.title_layout,this);
        initView();
        setEvent();
    }

    private void setEvent() {
        leftIv.setOnClickListener(this);
        rightIv.setOnClickListener(this);
    }

    private void initView() {
        leftIv = findViewById(R.id.title_iv_left);
        rightIv = findViewById(R.id.title_iv_right);
        titleTv = findViewById(R.id.title_tv);
        layout = findViewById(R.id.titleviews);
    }
    /** 设置标题*/
    public void setTitle(String title){
        titleTv.setText(title);
    }
    public void setTitle(int titleId){
        titleTv.setText(titleId);
    }
    /** 设置标题颜色*/
    public void setTitleColor(int color){
        titleTv.setTextColor(color);
    }
    /** 设置背景颜色*/
    public void setBgResource(int color){
        layout.setBackgroundResource(color);
    }
    public void setBgColor(int color){
        layout.setBackgroundColor(color);
    }

    /** 设置是否显示左右图片*/
    public void setVisibleImg(int left,int right){
        leftIv.setVisibility(left);
        rightIv.setVisibility(right);
    }

    /** 修改左边显示图片*/
    public void setLeftImgResource(int resId){
        leftIv.setImageResource(resId);
    }
    public void setRightImgResource(int resId){
        rightIv.setImageResource(resId);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.title_iv_left:
//                ((Activity)getContext()).finish();
                if(leftListener != null){
                    leftListener.onClick(view);
                }
                break;
            case R.id.title_iv_right:
                if(rightListener!=null){
                    rightListener.onClick(view);
                }
                break;
        }
    }
}

对话框

  1. 新建AlertDialog.Builder对象
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
  2. 设置一些属性
    builder.setXXX()
  3. builder.create().show();

简单对话框

    /**
     * 最简单的对话框: 确认对话框
     */
    private void simpleDialog() {
        //1. 创建对话框的装饰对象
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        //2. 设置显示内容
        builder.setIcon(R.mipmap.jvxie)
                .setTitle("提示信息")
                .setMessage("您确定要退出当前页面吗")
                //右边按钮
                .setPositiveButton("取消", null)
                //左边按钮
                .setNegativeButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        finish();
                    }
                });
        //3. 获取对话框对象
        AlertDialog dialog = builder.create();
        dialog.show();
    }

单选对话框

    /**
     * 单选按钮的对话框
     */
    private void singleDialog() {
        String [] arr = {"男", "女", "其他"};
        //1. 创建对话框的装饰对象
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setIcon(R.mipmap.baiyang)
                .setTitle("请选择您的性别")
                .setSingleChoiceItems(arr, 0, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        showToast("您选择了性别: " + arr[which]);
                        //取消对话框
                        dialog.cancel();
                    }
                });
        builder.create().show();
    }

    private void showToast(String s) {
        Toast.makeText(this, s, Toast.LENGTH_SHORT).show();
    }

列表对话框

    private void listDialog() {
        ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mDatas);
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setIcon(R.mipmap.jinniu)
                .setTitle("请选择您的学校科目")
                .setAdapter(adapter, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        showToast("您选择了: " + mDatas.get(which));
                    }
                });
        builder.create().show();
    }

多选按钮对话框

 String mArr[] = {"JAVA", "Android", "C", "C++", "Python", "数据运营", "算法", "数据结构", "C#"};
    boolean bArr[] = {false, false, false, false,false,false,false,false,false};
    /**
     * 多选按钮对话框
     */
    private void multiDialog() {
        List<String> list = new ArrayList<>();
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setIcon(R.mipmap.jinniu)
                .setTitle("请选择您的学校科目")
                .setMultiChoiceItems(mArr, bArr, new DialogInterface.OnMultiChoiceClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which, boolean isChecked) {

                    }
                }).setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        for (int i = 0; i < bArr.length; i++) {
                            if(bArr[i]){
                                list.add(mArr[i]);
                            }
                        }
                        showToast("您选择了: " + list.toString());
                    }
                }).setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();
                    }
                });
        builder.create().show();
    }

自定义对话框

layout/dialog_input.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white"
    android:padding="20dp">
    <TextView
        android:id="@+id/dialog_input_tv1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="备注"
        android:textSize="26sp"
        android:textStyle="bold"/>
    <EditText
        android:id="@+id/diput_et1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"/>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_marginTop="20dp">
        <androidx.appcompat.widget.AppCompatButton
            android:id="@+id/diput_btn1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="取消"
            android:background="@drawable/bg_btn"/>
        <androidx.appcompat.widget.AppCompatButton
            android:id="@+id/diput_btn2"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:layout_marginLeft="10dp"
            android:text="确定"
            android:background="@drawable/bg_btn"/>
    </LinearLayout>

</LinearLayout>

view/inputMsgDialog.java

相当于弹出一个小页面,所以与之前自定义view不同的是不需inflate转换成view对象,也因此可以直接在自定义类中调用onClick方法

package com.xyl.app1107.view;

import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import androidx.annotation.NonNull;

import com.xyl.app1107.R;

public class InputMsgDialog extends Dialog implements View.OnClickListener {
    EditText inputEt;
    Button rightBtn, leftBtn;
    TextView titleTv;

    public InputMsgDialog(@NonNull Context context) {
        super(context);
    }

    public interface OnBtnClickListener{
        public void onBtnClick(int gravity);
    }
    OnBtnClickListener onLeftBtnClickListener, onRightBtnClickListener;

    public void setOnLeftBtnCLickListener(OnBtnClickListener onLeftBtnClickListener){
        this.onLeftBtnClickListener = onLeftBtnClickListener;
    }

    public void setOnRightBtnClickListener(OnBtnClickListener onRightBtnClickListener){
        this.onRightBtnClickListener = onRightBtnClickListener;
    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dialog_input);
        initView();
        setEvent();
    }

    private void setEvent() {
        leftBtn.setOnClickListener(this);
        rightBtn.setOnClickListener(this);
    }

    private void initView() {
        titleTv = findViewById(R.id.dialog_input_tv1);
        inputEt = findViewById(R.id.diput_et1);
        rightBtn = findViewById(R.id.diput_btn1);
        leftBtn = findViewById(R.id.diput_btn2);
    }
    public void setTitle(String text){
        titleTv.setText(text);
    }

    public void setTitleColor(int color){
        titleTv.setTextColor(color);
    }

    public void setButtonText(String left, String right){
        leftBtn.setText(left);
        rightBtn.setText(right);
    }
    public void setWidth(){
        //得到当前对话框的窗口
        Window window = getWindow();
        //得到窗口的属性对象
        WindowManager.LayoutParams wlp = window.getAttributes();
        //设置窗口位置
        wlp.gravity = Gravity.BOTTOM;
        //获取屏幕的宽度
        Display display = window.getWindowManager().getDefaultDisplay();
        wlp.width = display.getWidth();
        //将背景设置为透明,去除边框
        window.setBackgroundDrawableResource(android.R.color.transparent);
        //设置窗口属性
        window.setAttributes(wlp);
    }
    /**
     * 获取输入内容的函数
     */
    public String getInputMsg(){
        return inputEt.getText().toString().trim();
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.diput_btn1:
                if(onLeftBtnClickListener!=null){
                    onLeftBtnClickListener.onBtnClick(Gravity.LEFT);
                }
                cancel();
                break;
            case R.id.diput_btn2:
                if (onRightBtnClickListener!=null){
                    onRightBtnClickListener.onBtnClick(Gravity.RIGHT);
                }
                cancel();
                break;
        }
    }
}

使用自己写的dialog

   /**
     * 使用自己写的对话框
     */
    private void customDialog(){
        InputMsgDialog dialog = new InputMsgDialog(this);
        dialog.show();

        dialog.setTitle("记录消费信息");
        dialog.setTitleColor(Color.RED);
        dialog.setWidth();
        dialog.setOnRightBtnClickListener(new InputMsgDialog.OnBtnClickListener() {
            @Override
            public void onBtnClick(int gravity) {
                String inputMsg = dialog.getInputMsg();
                tv = findViewById(R.id.tv1);
                tv.setText(inputMsg);
            }
        });
    }

日期对话框

  /**
     * 显示日期对话框
     */
    private void showDateDialog() {
        Calendar calendar = Calendar.getInstance();
        DatePickerDialog dialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
                String msg = year + "年" + (month+1) + "月" + dayOfMonth + "日";
                tv.setText(msg);
            }
        }, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH));
        dialog.show();
    }

时间对话框

    private void showTimeDialog() {
        Calendar calendar = Calendar.getInstance();
        TimePickerDialog timePickerDialog = new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() {
            @Override
            public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                String msg = hourOfDay + ":" + minute;
                tv.setText(msg);
            }
        }, calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE), true);
        timePickerDialog.show();
    }

进度对话框

    int value = 0;
    ProgressDialog dialog;
    Handler handler = new Handler(){
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            if (value>=100) {
                dialog.dismiss();
            }
            else{
                value += 1;
                dialog.setProgress(value);
                handler.sendEmptyMessageDelayed(1, 100);
            }
        }
    };
    private void showProgressDialog() {
        dialog = new ProgressDialog(this);
        dialog.setIcon(R.mipmap.shuiping);
        dialog.setMessage("正在加载中....");
        dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        dialog.setMax(100);
        dialog.show();
        value = 0;
        handler.sendEmptyMessageDelayed(1, 100);
    }