自定义提示弹窗的时候动态设置,里面的文字信息出现空指针,解决方案
本次实现的 就是中间的那个弹窗,可用做数据加载时的提示,
效果图
先看看大致代码
public class MyDataDialog extends Dialog {
private static TextView msg;
private Context mContetx;
public MyDataDialog(@NonNull Context context) {
super(context, R.style.MyDialog);
mContetx = context;
}
public MyDataDialog(@NonNull Context context, @StyleRes int themeResId) {
// super(context, themeResId);
super(context, R.style.MyDialog);
mContetx = context;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_data_dialog);
msg = (TextView) findViewById(R.id.data_msg);
setCanceledOnTouchOutside(false);//点击别的地方能否取消掉圆形进度条()
setCancelable(true);//是否可取消
}
public void setMsg(String string) {
msg.setText(string + "");
}
}
//这里继承 Dialog 或者AlentDialog 都可以,越原始越好(继承Dialog要比继承他的子类好)
布局文件
<?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="wrap_content"
android:background="@drawable/shape_sell7"
android:gravity="center"
android:orientation="vertical"
android:padding="20dp">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@mipmap/error" />
<TextView
android:id="@+id/data_msg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="6dp"
android:text=""
android:textColor="#fff" />
</LinearLayout>
背景shape
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<!--MyPeogressDlg对话进度框背景-->
<solid android:color="#888F8F8F" />
<corners android:radius="6px" />
<stroke
android:width="0px"
android:color="#fff" />
</shape>
自定义Dialog的样式
<!--自定义dialog背景全透明无边框theme -->
<style name="MyDialog" parent="android:style/Theme.Dialog">
<!--背景颜色及和透明程度-->
<item name="android:windowBackground">@android:color/transparent</item>
<!--是否去除标题 -->
<item name="android:windowNoTitle">true</item>
<!--是否去除边框-->
<item name="android:windowFrame">@null</item>
<!--是否浮现在activity之上-->
<item name="android:windowIsFloating">true</item>
<!--是否模糊 类似手机qq退出时背景-->
<item name="android:backgroundDimEnabled">false</item>
</style>
自己抽取的 工具类方法
public class MyDialogUtlis {
/**
*
* @param context 上下文,当前activity
* @param msg 提示语
* @param isToast 是否自动消失
* @return
*/
public static MyDataDialog getMyDataDialog(Context context,String msg){
MyDataDialog myDataDialog= new MyDataDialog(context);
***myDataDialog.show();
myDataDialog.setMsg(msg);***
return myDataDialog;
}
}
按照正常的思维(以我的思维为基准O(∩_∩)O哈哈~),我们肯定是,先设置提示语,steMsg,再show,但是这样的话,发现布局里面的控件总是为空,报空指针异常
注意: 设置show和 设置setMsg的方法,顺序不能互换,必须先show在设置提示语
原因: dialog在new 的时候 并不会执行 oncreateView() 方法 因此里面的控件都未 初始化 而调用dialog.show()的时候才会执行oncreateView() 方法,
还有一种情况设置方法就是在oncreateView() 方法里面先将布局初始化出来,然后就可以再弹窗不show()的时候,也可以设置内容或者样式
下面我稍微改动了一下代码,布局,以及样式都没变,只是增加了一个方法而已,
工具类
public class MyDialogUtlis {
/**
*
* @param context 上下文,当前activity
* @param msg 提示语
* @param isToast 是否自动消失
* @return
*/
public static MyDataDialog getMyDataDialog(Context context,String msg,boolean isToast){
MyDataDialog myDataDialog= new MyDataDialog(context);
if (isToast){
myDataDialog.briefShow();
}else{
myDataDialog.defaultShow();
}
myDataDialog.setMsg(msg);
return myDataDialog;
}
}
自定义Dialog类
public class MyDataDialog extends Dialog {
private static TextView msg;
private Context mContetx;
public MyDataDialog(@NonNull Context context) {
super(context, R.style.MyDialog);
mContetx = context;
}
public MyDataDialog(@NonNull Context context, @StyleRes int themeResId) {
// super(context, themeResId);
super(context, R.style.MyDialog);
mContetx = context;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_data_dialog);
msg = (TextView) findViewById(R.id.data_msg);
setCanceledOnTouchOutside(false);//点击别的地方能否取消掉圆形进度条()
setCancelable(true);//是否可取消
}
public void setMsg(String string) {
msg.setText(string + "");
}
/**
* 短暂的显示 类似吐司,两秒后消失,可用作吐司
*/
public void briefShow() {
show();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
dismiss();
}
}, 2000);
}
/**
* 一直显示,必须手动调用dismis 可用作请求数据等耗时操作时使用,耗时操作完成,再手动调用消失
*/
public void defaultShow(){
show();
}
}
activity中的调用
MyDataDialog myDataDialog = MyDialogUtlis.getMyDataDialog(this,"Laoding...",false);