目录
知识点
1.layout_weight
分配剩余空间(长度或宽度)的权重
即:控件的最终大小=初始空间大小(如果定义了的话)+剩余屏幕空间大小(加权)
所以当只需要按照权重进行分配时,可以将初始大小都设置为为0dp。
代码
备注
新建了一个CustomDialog类继承了DIalog
CustomDialog.java
package com.example.myapplication.widget;
import android.app.Dialog;
import android.content.Context;
import android.graphics.Point;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.Display;
import android.view.View;
import android.view.WindowManager;
import android.widget.TextView;
import androidx.annotation.NonNull;
import com.example.myapplication.R;
public class CustomDialog extends Dialog implements View.OnClickListener {
private TextView mTvTitle,mTvMessage,mTvCancel,mTvConfirm;
//声明控件
private String title,message,cancel,confirm;
//声明变量
private IOnCancelListener cancelListener;
//声明两个监听器0
private IOnConfirmListener confirmListener;
public CustomDialog(@NonNull Context context) {
super(context);
}
public CustomDialog(@NonNull Context context,int themeId ) {
super(context);
}
public CustomDialog setTitle(String title) {//四个set方法
this.title = title;
return this;
}
public CustomDialog setMessage(String message) {
this.message = message;
return this;
}
//把返回类型改成CustomDialog,然后return this; 就可以实现链式调用类:.方法.方法.方法...
public CustomDialog setCancel(String cancel,IOnCancelListener cancelListener) {// Cancel和 Confirm需要再加一个监听器
this.cancel = cancel;
this.cancelListener=cancelListener;
return this;
}
public CustomDialog setConfirm(String confirm,IOnConfirmListener confirmListener) {
this.confirm = confirm;
this.confirmListener=confirmListener;
return this;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_custom_dialog);
//设置宽度
WindowManager m=getWindow().getWindowManager();
Display d=m.getDefaultDisplay();
WindowManager.LayoutParams p=getWindow().getAttributes();
Point size=new Point();
d.getSize(size);
p.width=(int)(size.x*0.8);
//固定代码设置宽度为屏幕的0.8倍
mTvTitle=findViewById(R.id.tv_title);
mTvMessage=findViewById(R.id.tv_message);
mTvCancel=findViewById(R.id.tv_cancel);
mTvConfirm=findViewById(R.id.tv_confirm);
//找到控件
if(!TextUtils.isEmpty(title))//判断非空
mTvTitle.setText(title);
if(!TextUtils.isEmpty(message))
mTvMessage.setText(message);
if(!TextUtils.isEmpty(cancel))
mTvCancel.setText(cancel);
if(!TextUtils.isEmpty(confirm))
mTvConfirm.setText(confirm);
mTvCancel.setOnClickListener(this);
mTvConfirm.setOnClickListener(this);
//这里因为CustomDialog实现了OnClickListener,所以直接穿入CustomDialog就行
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.tv_cancel:
if(cancelListener!=null)
cancelListener.onCancel(this);
dismiss();
break;
case R.id.tv_confirm:
if(confirmListener!=null)
confirmListener.onComfirm(this);
dismiss();
break;
}
}
public interface IOnCancelListener{
void onCancel(CustomDialog dialog);
}
//定义两个监听接口
public interface IOnConfirmListener{
void onComfirm(CustomDialog dialog);
}
}
layout\layout_dialog_custom.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"
android:gravity="center_horizontal"
android:background="@drawable/bg_custom_dialog">
<!--这里的layout_width以及layout_height虽然设置成了match_parent,、
但系统会默认改成wrap_content
参考 CustomDialog.java 的控制宽度那一段代码 -->
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:textColor="@color/colorBlack"
android:text="提示"
android:textStyle="bold"
android:layout_marginTop="20dp"/>
<TextView
android:id="@+id/tv_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:textColor="@color/colorBlack"
android:text="内容"
android:layout_marginTop="20dp"
android:layout_marginBottom="20dp"/>
<View
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:background="@color/colorGrey"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="45dp"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_cancel"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="取消"
android:textSize="20sp"
android:textColor="@color/colorBlue"
android:gravity="center"/>
<View
android:layout_width="0.5dp"
android:layout_height="match_parent"
android:background="@color/colorGrey"/>
<TextView
android:id="@+id/tv_confirm"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="确定"
android:textSize="20sp"
android:textColor="@color/colorBlue"
android:gravity="center"/>
</LinearLayout>
</LinearLayout>
drawable\layout_dialog_custom.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#FFFFFF"/>
<corners android:radius="5dp"/>
</shape>
CustomDialogActivity
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import com.example.myapplication.util.ToastUtil;
import com.example.myapplication.widget.CustomDialog;
public class CustomDialogActivity extends AppCompatActivity {
private Button mBtnDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_custom_dialog);
mBtnDialog=findViewById(R.id.btn_custom_dialog);
mBtnDialog.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
CustomDialog customDialog=new CustomDialog(CustomDialogActivity.this,R.style.CustomDialog);
customDialog.setTitle("提示").setMessage("确认删除此项?")
.setCancel("取消", new CustomDialog.IOnCancelListener() {
@Override
public void onCancel(CustomDialog dialog) {
ToastUtil.showMsg(getApplicationContext(),"cancel...");
}
}).setConfirm("确认", new CustomDialog.IOnConfirmListener() {
@Override
public void onComfirm(CustomDialog dialog) {
ToastUtil.showMsg(getApplicationContext(),"confirm...");
}
}).show();
}
});
}
}
activity_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">
<Button
android:id="@+id/btn_custom_dialog"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="自定义dialog"
android:textAllCaps="false"/>
</LinearLayout>
bg_custom_dialog.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#FFFFFF"/>
<corners android:radius="10dp"/>
</shape>
style.xml
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
</style>
<style name="MyProgressBar">
<item name="android:indeterminateDrawable">@drawable/bg_progress</item>
</style>
<style name="CustomDialog" parent="android:style/Theme.Dialog">
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowBackground">@color/colorPrimary</item>
</style>
</resources>