Activity模拟Dialog

最近收到一个需求,需要实现一个全局的dialog,这个可以通过监听activity的生命周期实现,但是显然成本太大,对性能也有不好的影响。这时候需要用activity去模拟一个dialog的功能,废话不多说,见代码:

  1. 模拟一个普通的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>
  1. 模拟一个底部弹出的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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值