自定義提示彈窗的時候動態設置,裏面的文字信息出現空指針,解決方案
本次實現的 就是中間的那個彈窗,可用做數據加載時的提示,
效果圖
先看看大致代碼
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);