加载dialog 动态设置文字出现空指针解决方案

本文介绍了在自定义提示弹窗中遇到动态设置文本时出现空指针异常的问题及其解决方案。强调了设置`show`方法和设置提示语的顺序,指出必须先`show`再设置内容,因为`Dialog`在`new`时不执行`onCreateView()`,只有在`show()`时才会初始化控件。同时提到了在`onCreateView()`中初始化布局的另一种方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自定义提示弹窗的时候动态设置,里面的文字信息出现空指针,解决方案

本次实现的 就是中间的那个弹窗,可用做数据加载时的提示,

效果图
这里写图片描述

先看看大致代码

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值