Android关于QQ登陆页的两个问题

wokenshin 发布于 2014/09/24 09:54
阅读 320
收藏 0
我想做一个类似于这样的登陆页。已经做出来了,但是又两个bug
先说一下QQ的登陆页的效果
如图1、2、3
1为默认页情况
2为点击“下三角” 显示 用户列表时的情况
3为点击用户名或密码框时弹出软键盘的情况

QQ的 “下三角”当再次点击 或是总窗口失去焦点时 它都会自动切换成“上三角”图片,
【bug 我实现了该功能,可是我的总窗口失去焦点和获取到焦点的时候这个“三角的图标”切换了两次焦点】

QQ的“软键盘”存在的时候 我在点击“下三角”时,软键盘会消失,同时用户列表会显示在原先的位置
【bug 我按上述操作,我的用户列表上移了,没有软键盘的时候是正常的】
 

下面是我的效果 按图片顺序 即为我的操作顺序,我想改成像QQ这样的效果,求高人指教。拜托了。

 

小弟 写了一个 selector 用来控制“三角”图标的上下切换,但是这里肯定有问题 请高人知道一下吧<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- 总窗口失去焦点时的背景图片 -->  
    <item android:drawable="@drawable/uplist"
          android:state_enabled="true" 
          android:state_window_focused="false"/> 

    <!-- 触摸模式按下时的背景图片 -->  
    <item android:drawable="@drawable/dropdownlist" 
          android:state_pressed="true"/>  
    <item android:drawable="@drawable/dropdownlist"
          android:state_enabled="true"
          android:state_focused="true"/> 
    <item android:drawable="@drawable/dropdownlist"
          android:state_enabled="true"/>  

    <!-- 获得焦点时的图片背景 -->  
    <item android:drawable="@drawable/dropdownlist"
          android:state_focused="true"/>  
</selector>

popupwindow 即相关代码:

        /**
     * 没有在onCreate方法中调用initWedget(),而是在onWindowFocusChanged方法中调用,
     * 是因为initWedget()中需要获取PopupWindow浮动下拉框依附的组件宽度,在onCreate方法中是无法获取到该宽度的
     */
        @Override
        public void onWindowFocusChanged(boolean hasFocus) 
        {
                super.onWindowFocusChanged(hasFocus);
                
                if (hasFocus && !flag)
                {
                        initWedget();//初始化界面控件
                        flag = true;
                }
        }
        /**
         * 初始化界面控件
         */
        private void initWedget()
        {
                //获取下拉框依附的组件宽度
        int width = userNameArea.getWidth();
        //下拉框依附组件宽度,也将作为下拉框的宽度
        pwidth = width;
        //设置点击下拉箭头图片事件,点击弹出PopupWindow浮动下拉框
        selectImage.setOnClickListener(new View.OnClickListener() 
        {
                        @Override
                        public void onClick(View v) 
                        {
                                //如果显示着软键盘且点击了用户列表下拉图标,则隐藏软键盘,这样做的目的是让界面更友好,同时popuwiondw要让其显示在用户文本框下方,所以下方不能有软键盘
                                View view = getWindow().peekDecorView();
                                if(view != null)//如果键盘显示着,就让其隐藏
                                {
                                         InputMethodManager inputmanger = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                                 inputmanger.hideSoftInputFromWindow(view.getWindowToken(), 0);
                                }
                                if(flag)//为true表明初始化完成
                                {
                                           //显示PopupWindow窗口
                                           //将selectPopupWindow作为parent的下拉框显示,
                                       //并指定selectPopupWindow在Y方向上向上偏移1pix,
//                                        selectPopupWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
                                        selectPopupWindow.showAsDropDown(userNameArea,0,1); //
                                }
                        }
                });
        //初始化PopupWindow
        initPopuWindow();
        }

         /**
     * 初始化PopupWindow
     */ 
        @SuppressWarnings("deprecation")
        private void initPopuWindow()
    { 
            //PopupWindow浮动下拉框布局 
        View loginwindow = (View) this.getLayoutInflater().inflate(R.layout.options, null); 
        listView = (ListView) loginwindow.findViewById(R.id.list); 
       
        OptionsAdapter userOptionsAdapter = new OptionsAdapter(this, userDatas); 
        listView.setAdapter(userOptionsAdapter); 

        selectPopupWindow = new PopupWindow(loginwindow, pwidth, LayoutParams.WRAP_CONTENT, true); 
        selectPopupWindow.setOutsideTouchable(true); 
        //这一句是为了实现弹出PopupWindow后,当点击屏幕其他部分及Back键时PopupWindow会消失,
        //没有这一句则效果不能出来,但并不会影响背景
        //如果注释掉下面一行代码,当删除所有下拉选项后,页面就点不了了,也无法点击恢复 按钮 
        selectPopupWindow.setBackgroundDrawable(new BitmapDrawable());
    }
        //自定义adapter
    class OptionsAdapter extends BaseAdapter 
    {
            private List<Map<String, String>> list = null;
        private Context context; 
            /**
             * 自定义构造方法
             * @param activity
             * @param datas
             */
        public OptionsAdapter(Context context, List<Map<String, String>> datas)
        {
                this.context = context;
                this.list = datas;
        }
            
                @Override
            public int getCount() 
            {
                    return list.size();
            }

            @Override
            public Object getItem(int position) 
            {
                    return list.get(position);
            }

            @Override
            public long getItemId(int position) 
            {
                    return position;
            }

            @Override
            public View getView(final int position, View convertView, ViewGroup parent) 
            {        
                    //ViewHolder 自定义的一个类  封装了两个组件TextView 和 ImageView
                    ViewHolder holder = null; 
            if (convertView == null) 
            { 
                holder = new ViewHolder(); 
                //下拉项布局
                convertView = LayoutInflater.from(context).inflate(R.layout.option_item, null); 
                holder.usernameText = (TextView) convertView.findViewById(R.id.item_text); 
                holder.delUserImag = (ImageView) convertView.findViewById(R.id.delImage); 
                
                convertView.setTag(holder); 
            }
            else 
            { 
                holder = (ViewHolder) convertView.getTag(); 
            } 
            
            holder.usernameText.setText(list.get(position).get("username").toString());
            //为下拉框选项文字部分设置事件,点击将其文字填充到文本框
            holder.usernameText.setOnClickListener(new View.OnClickListener() 
            {
                            @Override
                            public void onClick(View v) 
                            {
                                    Map<String, String> item = list.get(position);
                                    username.setText(item.get("username").toString());
                                    password.setText(item.get("password").toString());
                                    selectPopupWindow.dismiss();
                            }
                    });
            
            //为下拉框选项删除图标部分设置事件,最终效果是点击将该选项删除
            holder.delUserImag.setOnClickListener(new View.OnClickListener() 
            {
                            @Override
                            public void onClick(View v) 
                            {        
                                    dialogDelUser();
                            }

                                private void dialogDelUser() 
                                {
                                        Map<String, String> item = list.get(position);
                                    String usercode = item.get("username").toString();
                                    
                                        AlertDialog.Builder builder = new AlertDialog.Builder(LoginActivity.this);
                                        //设置对话框标题
                                        builder.setTitle("删除用户?");
                                        //设置图标
                                        builder.setIcon(R.drawable.del);
                                        builder.setMessage("您确认要删除用户【"+usercode+"】的信息吗?");
                                        //为AlertDialog.Builder添加【确定】按钮 和响应事件
                                        builder.setPositiveButton("删除", new OnClickListener()
                                        {
                                                @Override
                                                public void onClick(DialogInterface dialog, int which) 
                                                {
                                                        delUserData();//删除对应用户信息及下拉表中的信息
                                                        Toast.makeText(LoginActivity.this, "删除成功!", Toast.LENGTH_LONG).show();
                                                        //刷新下拉列表
                                                    ((BaseAdapter) listView.getAdapter()).notifyDataSetChanged();
                                                }});
                                        //为AlertDialog.Builder添加【取消】按钮
                                        builder.setNegativeButton("取消", null);
                                        //创建AlertDialog对象
                                        builder.create();
                                        //显示该对话框
                                        builder.show();
                                }

                                private void delUserData() 
                                {
                                        // TODO Auto-generated method stub
                                        //选中下拉选项中的“×”删除图标、将选中项的内容移除下拉项数据、删除数据库中对应用户的数据
                                    Map<String, String> item = list.get(position);
                                    String usercode = item.get("username").toString();
                                    userDatas.remove(position);
                                    //删除数据库中对应用户usercode的一行用户数据
                                    MobileUserDAO.deleteUserInfo(usercode);
                                    if(userDatas.size() < 2)
                                    {
                                            item = list.get(0);//默认将list中的第一用户信息显示在UI上
                                        username.setText(item.get("username").toString());
                                        password.setText(item.get("password").toString());
                                            selectImage.setVisibility(View.GONE);
                                            selectPopupWindow.dismiss();//当下拉想中只有一项数据时,这里就不让其显示了
                                    }
                                    //判断 当链表中的用户数为零时 隐藏下拉三角图标
                                    if(userDatas.size()==0)
                                    {        
                                            username.setText("");
                                            password.setText("");
                                    }
                                }
                    });
            return convertView; 
            }

            class ViewHolder 
            { 
                TextView usernameText; 
                ImageView delUserImag; 
            }
    }
}

加载中
返回顶部
顶部