0
点赞
收藏
分享

微信扫一扫

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;
 
 
        }
 
 
    }
 
 
}



最终效果如下:

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



源代码


举报

相关推荐

0 条评论