加載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 + "");
    }
}

//這裏繼承 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() 方法,

下面我稍微改動了一下代碼,佈局,以及樣式都沒變,只是增加了一個方法而已,

工具類

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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章