android实现弹出式对话框方法分析

利用Dialog,PopupWindow都可以实现对话框的功能。

Dialog实现比较方便,可以用系统自带的样式,也可以自定义一下,但是它显示位置比较固定,有时不能满足我们的需求。

而PopupWindow可以通过showAtLocation设置显示位置,也可以通过ShowAsDropDown以下拉方式显示在某个View的相对位置上,基本能满足我们的需求。


举个例子简单说明一下

为要使用自定义样式的dialog,需要写个style,在values/styles.xml里编写

<style name="MyDialog" parent="@android:Theme.Dialog">

        <!-- 设置dialog有无标题栏 -->
        <item name="android:windowNoTitle">true</item>
        <!-- 设置dialog出现时是否屏幕变黑 -->
        <item name="android:backgroundDimEnabled">false</item>
        <!-- 设置window的背景 -->
        <item name="android:windowBackground">@null</item>
        <!-- Dialog的windowFrame框为无 -->
        <item name="android:windowFrame">@null</item>
        <!-- 是否浮现在activity之上 -->
        <item name="android:windowIsFloating">false</item>
        <!-- 是否半透明 -->
        <item name="android:windowIsTranslucent">false</item>
        <!-- 设置dialog的背景 -->
        <item name="android:background">@android:color/background_dark</item>
    </style>

调用的时候这样调用

AlertDialog.Builder aBuilder = new AlertDialog.Builder(this,
                    R.style.MyDialog);
            RelativeLayout layout = (RelativeLayout) getLayoutInflater()
                    .inflate(R.layout.activity_main_custom, null);
            aBuilder.setView(layout);
            AlertDialog dialog = aBuilder.create();
            dialog.show();

再说下使用Activity作为对话框的用法:
定义一个style
     <style name="PopupActivity">
           <!-- 设置window的背景 -->
        <item name="android:windowBackground">@android:color/transparent</item>
        <!-- 是否半透明 -->
        <item name="android:windowIsTranslucent">true</item>
         <!-- 设置dialog有无标题栏 -->
        <item name="android:windowNoTitle">true</item>
        <!--设置切换动画  -->
        <item name="android:windowAnimationStyle">@style/Anim_scale</item>
    </style>

    动画效果
<style name="Anim_scale" parent="@android:style/Animation.Activity">
        <item name="android:activityOpenEnterAnimation">@anim/scale_in</item>
        <item name="android:activityOpenExitAnimation">@anim/scale_out</item>
        <item name="android:activityCloseEnterAnimation">@anim/scale_in</item>
        <item name="android:activityCloseExitAnimation">@anim/scale_out</item>
    </style>

最后看下MainAcivity.java类

public class MainActivity extends Activity implements OnClickListener {

    private Button mButtonDefaultDialog;
    private Button mButtonCustomDialog;
    private Button mButtonPopupWindow;
    private Button mButtonPopupActivity;
    PopupWindow popupWindow;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
        mButtonDefaultDialog = (Button) findViewById(R.id.btn_main_default_dialog);
        mButtonCustomDialog = (Button) findViewById(R.id.btn_main_custom_dialog);
        mButtonPopupWindow = (Button) findViewById(R.id.btn_main_popup_window);
        mButtonPopupActivity = (Button) findViewById(R.id.btn_main_popup_activity);

        mButtonDefaultDialog.setOnClickListener(this);
        mButtonCustomDialog.setOnClickListener(this);
        mButtonPopupWindow.setOnClickListener(this);
        mButtonPopupActivity.setOnClickListener(this);

        // 装载R.layout.popupwindow对应的布局
        View root = getLayoutInflater().inflate(R.layout.popupwindow, null);
        // 创建PopupWindow对象
        popupWindow = new PopupWindow(root, LayoutParams.WRAP_CONTENT,
                LayoutParams.WRAP_CONTENT);
        // 实例化popupwindow.xml布局中的组件
        Button button = (Button) root.findViewById(R.id.close_popup_window);
        button.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.btn_main_default_dialog:
            // 使用系统自带theme
            AlertDialog.Builder builder = new AlertDialog.Builder(this,
                    R.style.AppTheme);
            RelativeLayout view = (RelativeLayout) getLayoutInflater().inflate(
                    R.layout.activity_main_default, null);
            builder.setView(view);
            AlertDialog alertDialog = builder.create();
            alertDialog.show();
            break;
        case R.id.btn_main_custom_dialog:
            // 直接使用Dialog的方式已经不推荐使用
            // Dialog dialog = new Dialog(MainActivity.this, R.style.MyDialog);
            // dialog.setContentView(R.layout.activity_main_custom);
            // dialog.show();
            // 使用自定义theme
            AlertDialog.Builder aBuilder = new AlertDialog.Builder(this,
                    R.style.MyDialog);
            RelativeLayout layout = (RelativeLayout) getLayoutInflater()
                    .inflate(R.layout.activity_main_custom, null);
            aBuilder.setView(layout);
            AlertDialog dialog = aBuilder.create();
            dialog.show();
            break;
        case R.id.btn_main_popup_window:
            // 以下拉方式显示
            // popupWindow.showAsDropDown(arg0);
            // 将PopupWindow显示在指定位置
            popupWindow.showAtLocation(mButtonPopupWindow, Gravity.BOTTOM,
                    LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
            break;
        case R.id.btn_main_popup_activity:
            // 弹出式显示Activity
            Intent intent = new Intent(MainActivity.this, PopupActivity.class);
            startActivity(intent);
            break;
        case R.id.close_popup_window:
            // 关闭PopupWindow
            popupWindow.dismiss();
            break;

        default:
            break;
        }
    }
}

上一篇:SpringBoot使用Swagger


下一篇:Fragment进阶1——Fragment与Activity之间的通信与切换