问题:dialog多次弹出,但文本还是显示第一次传入set的值。
原因:onCreate只会走一次,在里面setText也只会走一次,
解决:onStart 和 show 会多次调用,所以在这两个方法中进行设置值即可。
分析dialog调用时的周期:
MyDialog:
//打开dialog:
// 构造方法
// set方法
// onCreate
// onStart
// show
//再次打开dialog:
// onStop
// set
// onStart
// show
public class MyDialog extends Dialog {
private String msg;
private Context context;
private TextView msgTv;
private TextView cancelBtn;
private TextView confirmBtn;
public MyDialog(Context context) {
super(context, R.style.dialog);
this.context = context;
System.out.println("2==================构造");
}
public void setPassengerNum(int passengerNum) {
msg = "" + passengerNum;
System.out.println("2==================set");
}
@Override
protected void onStop() {
super.onStop();
System.out.println("2==================onStop");
}
@Override
protected void onStart() {
super.onStart();
System.out.println("2==================onStart");
if (!TextUtils.isEmpty(msg)) { //在此设置
msgTv.setText(msg);
}
}
@Override
public void show() {
super.show();
System.out.println("2==================show");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog_departure);
init();
msgTv = ((TextView) this.findViewById(R.id.dialog_departure_msg_tv));
cancelBtn = ((TextView) this.findViewById(R.id.dialog_departure_cancel_btn));
confirmBtn = ((TextView) this.findViewById(R.id.dialog_departure_confirm_btn));
cancelBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
onConfirmListener.onDepartureFailure();
}
});
confirmBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
onConfirmListener.onDepartureOk();
}
});
System.out.println("2==================onCreate");
}
private void init() {
Window window = getWindow();
if (window != null) {
window.setDimAmount(0.5f);
}
setCancelable(false);
setCanceledOnTouchOutside(false);
}
private OnConfirmListener onConfirmListener;
public interface OnConfirmListener {
void onDepartureOk();
void onDepartureFailure();
}
public void setOnConfirmListener(OnConfirmListener onConfirmListener) {
this.onConfirmListener = onConfirmListener;
}
}
MainActivity:
public class MainActivity extends AppCompatActivity implements MyDialog.OnConfirmListener {
private int count;
private MyDialog myDialog;
private Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
System.out.println("1============onCreate");
setContentView(R.layout.activity_main);
TextView btn2 = (TextView) findViewById(R.id.btn2);
TextView btn1 = (TextView) findViewById(R.id.btn1);
ShortcutBadger.applyCount(this.getApplicationContext(), 60);
handler = new Handler();
myDialog = new MyDialog(MainActivity.this);
myDialog.setOnConfirmListener(MainActivity.this);
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
count = 100;
setDialog();
}
});
btn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
count = 99;
setDialog();
}
});
}
@Override
protected void onRestart() {
super.onRestart();
System.out.println("1============onRestart");
}
@Override
protected void onStart() {
super.onStart();
System.out.println("1============onStart");
}
@Override
protected void onResume() {
super.onResume();
System.out.println("1============onResume");
}
@Override
protected void onPause() {
super.onPause();
System.out.println("1============onPause");
}
@Override
protected void onStop() {
super.onStop();
System.out.println("1============onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
System.out.println("1============onDestroy");
}
private void setDialog() {
myDialog.setPassengerNum(count);
handler.postDelayed(new Runnable() {
@Override
public void run() {
myDialog.show();
}
}, 1000);
System.out.println("1============" + count);
}
@Override
public void onDepartureOk() {
System.out.println("1============onDepartureOk");
}
@Override
public void onDepartureFailure() {
System.out.println("1============onDepartureFailure");
}
@Override
public void onBackPressed() {
super.onBackPressed();
System.out.println("1============onBackPressed");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
System.out.println("1============onSaveInstanceState");
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
System.out.println("1============onNewIntent");
}
}
打印结果:
以下 2为dialog 1为activity
初始化activity和dialog
1============onCreate
2==================构造
1============onStart
1============onResume
打开dialog
2==================set
2==================onCreate
2==================onStart
2==================show
关闭dialog
2==================onStop
按home键
1============onPause
1============onSaveInstanceState
1============onStop
重新进入
1============onRestart
1============onStart
1============onResume
再次打开dialog
2==================set
2==================onStart
2==================show
在dialog中设置textview的文本,可在onStart和show的super前设置。