PopupWindow+listview产生的焦点问题,求解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PopupWindow+listview产生的焦点问题,求解相关的知识,希望对你有一定的参考价值。

请教:我在popupwindow里面放一个ListView,如果我想点击其它地方popupwindow不消失同时也能响应ListView的点击事件怎么办 我试了下: // 使其聚集 popupWindow.setFocusable(true); // 设置允许在外点击消失 popupWindow.setOutsideTouchable(false);但是不行,这样的话点击外面popupwindow还是会消失,但是如果设置 popupWindow.setFocusable(false);的话,虽然在外面点击popupwindow不消失了,但是ListView的点击事件却没办法响应了,怎么办,求解

参考技术A 只能很遗憾的说:这个popupwindow的问题是没办法解决的popupwindow是一个阻塞式的弹出框,他没有关闭是没办法操作主UI的 参考技术B 如果你点击其他的地方不是一个耗时的操作,可以用以个笨一点的方法,就是点了其他的地方后马上弹出一个Pop出来 参考技术C 用 BaseAdapter,在Adapter中相应相关的交互操作 ,然后设置listview中item的点击效果(selector)就行了。
目前还在看怎么刷新popupwindow中的listview...
参考技术D 确实 以后会用到 ,遇到了还要求助楼主!

PopupWindow的使用

如图是效果图

   

2种常用PopupWindow的使用

下载地址:http://download.csdn.net/detail/qq_29774291/9683258

第一个展示一个下拉的ListView

    /**
     * 展示第一个弹窗
     */
    private ListView mListView;
    private String[] itemStrings = {"第一个人啊","第二个人啊","第三个人啊","第四个人啊","第五个人啊","第六个人啊","第七个人啊"};
    protected void setOnePoP() {
        // TODO Auto-generated method stub
        View contentView = View.inflate(this, R.layout.pop_list, null);
        if(popup_one == null){
            popup_one = new PopupWindow(contentView,btn_one.getWidth(),LayoutParams.WRAP_CONTENT,true);            
        }
        mListView = (ListView)contentView.findViewById(R.id.lv_pop_listview);
        mListView.setAdapter(new MyAdapter(MainActivity.this, itemStrings));
        popup_one.setFocusable(true);
        popup_one.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        popup_one.setOutsideTouchable(true);
        popup_one.showAsDropDown(btn_one);
    }
    /**
     * ListView的适配器
     * @author Administrator
     *
     */
    private class MyAdapter extends BaseAdapter{
        private Context mContext;
        private String [] item ;
        
        public MyAdapter(Context mContext, String[] item) {
            this.mContext = mContext;
            this.item = item;
        }

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return item.length;
        }

        @Override
        public Object getItem(int arg0) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public long getItemId(int arg0) {
            // TODO Auto-generated method stub
            return 0;
        }

        @Override
        public View getView(int arg0, View arg1, ViewGroup arg2) {
            // TODO Auto-generated method stub
            ViewHolder holder = null;
            if(arg1 == null){
                holder = new ViewHolder();
                arg1 = View.inflate(mContext, R.layout.item_list, null);
                holder.tv_name = (TextView)arg1.findViewById(R.id.item_tv_formname);
                arg1.setTag(holder);
            }else {
                holder = (ViewHolder)arg1.getTag();
            }
            holder.tv_name.setText(item[arg0] + "");
            return arg1;
        }
        
    }
    static class ViewHolder{
        private TextView tv_name;
    }

第二个展示在下方展示一个弹窗,并设置屏幕透明度屏幕变暗的效果

代码如下

    /**
     * 在底部展示一个弹窗,并把界面的颜色变暗
     */
    protected void setTwoPoP() {
        View view = View.inflate(MainActivity.this, R.layout.pop_two, null);
        if(popup_two == null){
            popup_two = new PopupWindow(view,LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT,true);
        }
        Button btn_dis = (Button)view.findViewById(R.id.btn_dis);
        btn_dis.setOnClickListener(new View.OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                if(popup_two !=null && popup_two.isShowing()){
                    popup_two.dismiss();
                    backgroundAlpha(1f);
                }
            }
        });
        popup_two.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        //展示一个动画
        popup_two.setAnimationStyle(R.style.popWindow_anim_style);
        popup_two.setFocusable(true);
        popup_two.setOutsideTouchable(true);
        backgroundAlpha(0.5f);
        popup_two.showAtLocation(MainActivity.this.getWindow().getDecorView(), Gravity.BOTTOM, 0, 0);
        popup_two.setOnDismissListener(new PopupWindow.OnDismissListener() {
            
            @Override
            public void onDismiss() {
                // TODO Auto-generated method stub
                backgroundAlpha(1f);
            }
        });
    }
    /**
     * 设置添加屏幕的背景透明度
     * @param bgAlpha
     */
    public void backgroundAlpha(float bgAlpha)  
    {  
        this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
        WindowManager.LayoutParams lp = this.getWindow().getAttributes();  
        lp.alpha = bgAlpha;
        this.getWindow().setAttributes(lp);
    }

第三对于第2中效过,用Dialog也可以实现,需要设置Dialog在屏幕的位置,不过用Dialog实现时,屏幕有渐变的效果不是一下变暗

    /**
     * 显示一个弹窗
     */
    @SuppressWarnings("deprecation")
    private void showDialog(){
        View view = View.inflate(PhotoActivity.this, R.layout.choose_photo_dialog, null);
        final Dialog dialog = new Dialog(this, R.style.Dialog);        
        dialog.setContentView(view,new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
        Window window = dialog.getWindow();
        window.setWindowAnimations(R.style.main_menu_animstyle);
        WindowManager.LayoutParams wl = window.getAttributes();
        wl.x = 0;
        wl.y = getWindowManager().getDefaultDisplay().getHeight();
        wl.width = ViewGroup.LayoutParams.MATCH_PARENT;
        wl.height = ViewGroup.LayoutParams.WRAP_CONTENT;
        dialog.onWindowAttributesChanged(wl);
        dialog.setCanceledOnTouchOutside(true);
        dialog.show();
}

其中在TextView下展示添加一个下划线

         

这个效果是使用图层来实现的

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 边框颜色值 -->
    <item>
        <shape>
            <solid android:color="#3547B1"/>
        </shape>
    </item>
    <!-- 主体背景颜色值 -->
    <item android:bottom="2dp">
        <shape>
            <solid android:color="#ffffff"/>
            <padding
                android:bottom="10dp"
                android:left="10dp"
                android:right="10dp"
                android:top="10dp"/>
        </shape>
    </item>
</layer-list>

 补充:

在一个TextView展示2种颜色,大小不同的文本也可以用富文本控间

SpannableString test = new SpannableString("我的评语:这个不是的发生的发生的发生的冯绍峰sdfsdf是打发斯蒂芬谁发的");
        test.setSpan(new TextAppearanceSpan(this, R.style.textone), 0, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        test.setSpan(new TextAppearanceSpan(this, R.style.texttwo), 5, test.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        tv_text.setText(test);
     <style name="textone">
         <item name="android:textSize">16sp</item>
         <item name="android:textColor">#000</item>
     </style>
     <style name="texttwo">
         <item name="android:textSize">14sp</item>
         <item name="android:textColor">#f00</item>
     </style>

 

以上是关于PopupWindow+listview产生的焦点问题,求解的主要内容,如果未能解决你的问题,请参考以下文章

怎样自动弹出popupwindow

PopupWindow+ListView

Android 仿美团下拉(PopupWindow)列表(ListView)一二级分类菜单的功能

android ListView刷新焦点问题

Android popupwindow 失去焦点或者点击空白区域时消失的解决方法

android中PopupWindow弹出窗体后,为啥不能点击其他控件