Dialog在android中的应用(一)

如果做一个如下图的Dialog,首先要定义样式:

 <style name="DropdownFilterDialogStyle" parent="@android:style/Theme.Light.NoTitleBar">
        <item name="android:windowSoftInputMode">stateUnchanged|adjustResize</item>
        <item name="android:colorBackgroundCacheHint">@null</item>
        <item name="android:windowFrame">@null</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:backgroundDimEnabled">true</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowBackground">@android:color/transparent</item>
    </style>

定义一个基类,基类里面有一些基本方法:

public abstract class DropDownFilterDialog extends Dialog {

    protected ArrayList<DropDownItem> mTopMenuList;
    OnDropdownClickListener mDropdownClickListener;
    protected LinearLayout mDropDownMenuLayout;
    public Context mContext;
    private int mCurrentIndex = 0;

    public void setCurrentIndex(int mCurrentIndex) {
        this.mCurrentIndex = mCurrentIndex;
    }

    public void setTopMenuItemList(ArrayList<DropDownItem> mTopMenuList) {
        this.mTopMenuList = mTopMenuList;
    }

    public DropDownFilterDialog(Context context) {
       <strong> super(context, R.style.DropdownFilterDialogStyle);</strong>
        mContext = context;
    }

    public interface OnDropdownClickListener {
        void onDropdownHide();
        void onClickItem(int index);
    }

    public void setDropDownClickListener(OnDropdownClickListener dropdownClickListener) {
        mDropdownClickListener = dropdownClickListener;
    }

    public abstract void hideDropDownFilter(boolean showAnimation);

    public abstract void showDialog(boolean showAnimation, View banner);

    public void init() {
        mDropDownMenuLayout = (LinearLayout) findViewById(R.id.text_chat_menu_linear);
        constructButton(mTopMenuList);
    }

    @Override
    protected void onStart() {
        super.onStart();
        init();
    }

    public void constructButton(ArrayList<DropDownItem> list) {
        mDropDownMenuLayout.removeAllViews();
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT);
//        mDropDownMenuLayout.addView(View.inflate(mContext,
//                R.layout.view_top_menu_separator, null), params);
        final int size = list.size();
        final int lastPosition = size - 1;
        for (int i = 0; i < size; i++) {
            DropDownItem item = list.get(i);
            View view = View.inflate(mContext, R.layout.dropdown_menu_item_layout,
                    null);
            view.setTag(i);
            view.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    hideDropDownFilter(true);
                    mDropdownClickListener.onClickItem((Integer) view.getTag());
                }
            });

            TextView btn = (TextView) view
                    .findViewById(R.id.top_menu_button);
            btn.setText(item.getName());
            btn.setTag(item.getIndex());
            if (mCurrentIndex == i) {
                btn.setTextColor(mContext.getResources().getColor(R.color.contact_detail_phone_related_color_pressed));
            }
            TextView tab_indicator_counter = (TextView) view.findViewById(R.id.indicator_counter);
            if (item.getCouter() == 0) {
                tab_indicator_counter.setVisibility(View.GONE);
            } else {
                tab_indicator_counter.setText(String.valueOf(item.getCouter()));
            }

            boolean showSeparator = true;
            if (size == 1) {
                showSeparator = false;
            } else if (i == lastPosition) {
                showSeparator = false;
            }
            view.setBackgroundResource(R.drawable.drop_down_filter_item_background_selector);
            mDropDownMenuLayout.addView(view, params);
            if (showSeparator) {
                LinearLayout.LayoutParams paramsForLine = new LinearLayout.LayoutParams(
                        WindowManager.LayoutParams.MATCH_PARENT, mContext.getResources().getDimensionPixelSize(R.dimen.top_menu_vertical_separator));
                paramsForLine.leftMargin = mContext.getResources().getDimensionPixelSize(R.dimen.drop_down_menu_item_margin_left_right);
                paramsForLine.rightMargin = paramsForLine.leftMargin;
                mDropDownMenuLayout.addView(View.inflate(mContext,
                        R.layout.drop_down_menu_divider_layout, null), paramsForLine);
            }
        }

        mDropDownMenuLayout.invalidate();
    }

}

然后是具体实现类:

public class DropDownFilterDialogForTablet extends DropDownFilterDialog {

    public DropDownFilterDialogForTablet(Context context) {
        super(context);
        mContext = context;
        Window window = getWindow();
        WindowManager.LayoutParams lp = window.getAttributes();
        lp.gravity = Gravity.CENTER_HORIZONTAL | Gravity.TOP;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.drop_down_filter_dialog);
    }

    @Override
    protected void onStart() {
        super.onStart();
        init();
    }

    public void hideDropDownFilter(boolean showAnimation) {
        dismiss();
        mDropdownClickListener.onDropdownHide();
    }

    public void init() {
        super.init();
        mDropDownMenuLayout.setBackgroundResource(R.drawable.dropdown_filters_background);
    }

    public void showDialog(boolean showAnimation, View banner) {
       <strong> Window window = getWindow();
        WindowManager.LayoutParams lp = window.getAttributes();
        int height = mContext.getResources().getDimensionPixelSize(R.dimen.drop_down_menu_item_margin_top_for_tablet);
        if (banner == null) {
            lp.y = height;
        } else {
            lp.y = height + banner.getMeasuredHeight();
        }</strong>
        show();
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            hideDropDownFilter(true);
            return true;
        }
        return false;
    }

    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        if (event.getAction() == KeyEvent.ACTION_DOWN
                && event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
            hideDropDownFilter(true);
            return true;
        }
        return super.dispatchKeyEvent(event);
    }

}

时间: 2024-10-19 09:09:03

Dialog在android中的应用(一)的相关文章

Dialog在android中的应用(二)

如果实现一个带动画的下拉的Dialog 沿用上篇的基类,实现实际上的子类: public class DropDownFilterDialogForPhone extends DropDownFilterDialog { private boolean mShowAnimation = true; private boolean mIsInAnimation; private boolean mFinishShowDialog = false; public DropDownFilterDial

Android 中常见控件的介绍和使用

1 TextView文本框 1.1 TextView类的结构 TextView 是用于显示字符串的组件,对于用户来说就是屏幕中一块用于显示文本的区域.TextView类的层次关系如下: java.lang.Object   ? android.view.View   ? android.widget.TextView 直接子类: Button, CheckedTextView, Chronometer, DigitalClock, EditText 间接子类: AutoCompleteTextV

android中给Dialog设置的动画如何自定义修改参数

============问题描述============ 在android中给Dialog设置动画的方法我只找到Dialog.getWindow().setWindowAnimation(int resID); 这样不是只能在styles里用xml定义动画吗? 但是我现在想要先用程序计算出一个屏幕上的点,在让Dialog从该点开始执行scaleAnimation. 我如何给我Dialog的动画设置起始点之类的参数呢? ============解决方案1============ 自定义一个dial

Android中Dialog

在Android中,Dialog是一个非常重要的UI, 它可以方便的给用户提示,用最简洁的方式向用户展示信息, 以下的图片是Dialog的一个整体架构,通过它,可以总体对Dialog有一个很清晰的认识. 从这张图中可以看到,Dialog为父类, 其下有最重要的, 我们最常用的AlertDilog, 而AlertDialog的子类,则是由DatPicker, ProgressDialog,TimePick来组成. 这几个子类都是我们在程序开发中最常用的,因此要重点理解, 我们可以试着想像一下,如下

Android中Dialog对话框的调用及监听

Android中经常会需要在Android界面上弹出一些对话框提示用户,比如App的退出的时候都会有各种框来挽留你的心,支付宝的时候输入密码的密码框,非常常见及其实用的功能,类似于JS中的alter,C#中C/S中常用MessgeBox,总而言之就是一个功能弹,弹,弹,本文就简单的叙述一下Dialog的各种弹框使用及监听,顺便写了一个简单的自定义弹框,接下来请看正文: 一般对话框 先看下整个App页面: 看下一般对话框的结果: 具体代码的实现,其中定义了两个按钮,一个是确定(PositiveBu

Android中控制Dialog呈现的时间

用线程控制dialog的呈现时间,思路很简单,直接show代码了,我也是为了方便自己记录 private void showProgressDialog() { pDialog = new ProgressDialog(mContext); pDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); pDialog.setProgress(100); pDialog.setMessage("请稍等一秒..."); pDialog.se

Android中Dialog的使用

上一篇博文讲到对话框popWindow的使用,这篇博文主要讲解Dialog的使用. 1.什么是Dialog? Dialog就是对话框的一种方式!在Android开发中,我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择,这种对话框叫Dialog.最经常使用的,大家也比较熟悉的,也使用比较频繁有AlertDialog,这边篇博文将比较详尽的讲解Dialog的使用. 2.Dialog的特性 Android的对话框有两种:PopupWindow和Dialog.它们的不同点在

浅谈android中的自定义封装易用的Dialog

好久没写android的博客,最近在做一个android的项目,里面用到我们经常用的一个控件就是对话框,大家都知道android自带的对话框是很丑的,android5.x之后除外.所以就出现了自定义view,自己定义美观的对话框.好我们就来自定义对话框. 整体思路:定义一个类然后去继承Dialog类,然后重写相应的构造器方法.大家都知道一般的对话框的创建过程都是来一个AlertDialog.Builder对象,然后使用一些set方法来设置标题内容以及设置一些自定义的view和点击的Button以

Android中制作自定义dialog对话框的实例

http://www.jb51.net/article/83319.htm 这篇文章主要介绍了Android中制作自定义dialog对话框的实例分享,安卓自带的Dialog显然不够用,因而我们要继承Dialog类来制作自己的对话框,需要的朋友可以参考下 自定义dialog基础版很多时候,我们在使用android sdk提供的alerdialog的时候,会因为你的系统的不同而产生不同的效果,就好比如你刷的是MIUI的系统,弹出框都会在顶部显示!这里简单的介绍自定义弹出框的应用. 首先创建布局文件d