最近收到一个需求,需要实现一个全局的dialog,这个可以通过监听activity的生命周期实现,但是显然成本太大,对性能也有不好的影响。这时候需要用activity去模拟一个dialog的功能,废话不多说,见代码:
- 模拟一个普通的dialog:
public class PopupDialogActivity extends Activity {
private TextView confirmView;
private TextView cancelView;
private TextView titleView;
private TextView promptView;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_pop_dialog);
overridePendingTransition(R.anim.activity_fade_in, R.anim.activity_fade_out);
confirmView= findViewById(R.id.popup_dialog_start);
cancelView= findViewById(R.id.popup_dialog_cancel);
titleView= findViewById(R.id.popup_dialog_title);
promptView= findViewById(R.id.popup_dialog_prompt);
initData();
}
private void initData() {
if(PopupDialog.getInstance().getConfirmText() != null) {
confirmView.setText(PopupDialog.getInstance().getConfirmText());
}
if(PopupDialog.getInstance().getCancelText() != null) {
cancelView.setText(PopupDialog.getInstance().getCancelText());
}
if(PopupDialog.getInstance().getTitle() != null) {
titleView.setText(PopupDialog.getInstance().getTitle());
}
if(PopupDialog.getInstance().getMessage() != null) {
promptView.setText(PopupDialog.getInstance().getMessage());
}
confirmView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
if(PopupDialog.getInstance().getListener() != null){
PopupDialog.getInstance().getListener().onConfirm();
}
}
});
cancelView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
if(PopupDialog.getInstance().getListener() != null){
PopupDialog.getInstance().getListener().onCancel();
}
}
});
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
initData();
}
@Override
public void finish() {
super.finish();
overridePendingTransition(R.anim.activity_fade_in, R.anim.activity_fade_out);
}
@Override
protected void onDestroy() {
super.onDestroy();
PopupDialog.destroy();
}
}
manifest定义:
<activity
android:name=".view.globaldialog.PopupDialogActivity"
android:theme="@style/alertDialogActivity"
android:launchMode="singleTask"
android:windowEnterAnimation="@anim/activity_fade_in"
android:windowExitAnimation="@anim/activity_fade_out">
</activity>
动画fade in:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:duration="@android:integer/config_mediumAnimTime"
android:fromAlpha="0"
android:toAlpha="1.0" />
</set>
theme定义:
<style name="dialogActivity">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowFrame">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:backgroundDimEnabled">true</item>
<item name="android:windowCloseOnTouchOutside">true</item>
</style>
<style name="alertDialogActivity" parent="@style/dialogActivity">
<item name="android:windowCloseOnTouchOutside">false</item>
</style>
- 模拟一个底部弹出的dialog:
需要修改dialog的尺寸,为match parent,可以在oncreate中增加以下代码
super.onCreate(savedInstanceState);
Window window = getWindow();
if (window != null) {
window.getDecorView().setPadding(0, 0, 0, 0);
window.setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT);
window.setGravity(Gravity.BOTTOM);
}
setContentView(R.layout.layout_feedback_dialog);
finish的时候动画不生效的问题,可以通过在finish()方法中使用overridePendingTransition方法:
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mComment.getWindowToken(), 0);
super.finish();
overridePendingTransition(R.anim.activity_bottom_in, R.anim.activity_bottom_out);
使用ApplicatonCOntext启动一个activity时,需要加new task的flag;
实现serializable接口的类,可以通过intent进行传递:
Intent intent = new Intent(CommonUtils.getAppContext(), FeedbackDialogActivity.class);
intent.putExtra(VIDEO_CHAT_INFO,videoChat);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
CommonUtils.getAppContext().startActivity(intent);
theme:
<style name="feedbackDialogActivity">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowFrame">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:backgroundDimEnabled">true</item>
<item name="android:windowCloseOnTouchOutside">true</item>
</style>
manifest:
<activity
android:name=".feedback.FeedbackDialogActivity"
android:theme="@style/feedbackDialogActivity"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustResize"
android:windowEnterAnimation="@anim/activity_bottom_in"
android:windowExitAnimation="@anim/activity_bottom_out">
</activity>
重点:
singleTask保证不会出现多个该activity的实例
onNewIntent方法中实现initData和UI的初始化,可以实现动态更新Dialog的UI