自定义控件
title_layout.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| <?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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
| 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;
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; }
public TitleView(Context context) { this(context,null); } 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:
if(leftListener != null){ leftListener.onClick(view); } break; case R.id.title_iv_right: if(rightListener!=null){ rightListener.onClick(view); } break; } } }
|
对话框
- 新建AlertDialog.Builder对象
AlertDialog.Builder builder = new AlertDialog.Builder(this);
- 设置一些属性
builder.setXXX()
builder.create().show();
简单对话框
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
private void simpleDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setIcon(R.mipmap.jvxie) .setTitle("提示信息") .setMessage("您确定要退出当前页面吗") .setPositiveButton("取消", null) .setNegativeButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finish(); } }); AlertDialog dialog = builder.create(); dialog.show(); }
|
单选对话框
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
private void singleDialog() { String [] arr = {"男", "女", "其他"}; 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(); }
|
列表对话框
1 2 3 4 5 6 7 8 9 10 11 12 13
| 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(); }
|
多选按钮对话框
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| 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(); }
|
自定义对话框
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| <?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不同的是不需inflate转换成view对象,也因此可以直接在自定义类中调用onClick方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
| 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
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); } }); }
|
日期对话框
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
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(); }
|
时间对话框
1 2 3 4 5 6 7 8 9 10 11
| 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(); }
|
进度对话框
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| 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); }
|