前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android在PopWindow中使用Spinner的心路历程

Android在PopWindow中使用Spinner的心路历程

作者头像
Vaccae
发布2019-07-25 16:04:58
1.7K1
发布2019-07-25 16:04:58
举报
文章被收录于专栏:微卡智享微卡智享

前言

最近在开发的项目程序中用到了PopWindow,结果在里面需要加一个点击选择的列表,于是就准备使用Spinner放在PopWindow,期间经历了几个问题,最后都一一解决了,这篇文章就介绍一下Spinner怎么在PopWindow中使用。

视频效果

按照惯例,我们先上最终实现的效果视频

代码演示

程序中我们点击组托弹出一个PopWindow,用于选择当前托盘号及单据类型,如下图

ppw_storelocation.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/seesimilarcolorThistle4"
    android:orientation="vertical"
    android:padding="10dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/seesimilarcolorThistle3"
        android:orientation="vertical"
        android:padding="10dp">


        <TextView
            android:id="@+id/ppw_storelocation_title"
            android:layout_width="match_parent"
            android:layout_height="35dp"
            android:gravity="center"
            android:text="扫描或输入库位信息"
            android:textColor="@color/seesimilarcolorGhostWhite"
            android:textSize="14dp" />


        <EditText
            android:id="@+id/ppw_storelocation_edt"
            android:layout_width="match_parent"
            android:layout_height="35dp"
            android:layout_marginTop="5dp"
            android:background="@color/seesimilarcolorGhostWhite"
            android:gravity="center"
            android:hint="扫描或输入库位码"
            android:textColor="@color/seesimilarcolorThistle4" />

        <TextView
            android:id="@+id/ppw_storelocation_typetitle"
            android:layout_width="match_parent"
            android:layout_height="35dp"
            android:gravity="center"
            android:text="入库类型"
            android:textColor="@color/seesimilarcolorGhostWhite"
            android:textSize="14dp" />


        <Spinner
            android:id="@+id/ppw_storelocation_spinner"
            android:layout_width="match_parent"
            android:layout_height="35dp"
            android:layout_marginTop="5dp"
            android:background="@color/seesimilarcolorGhostWhite"
            android:gravity="center"
            android:textAlignment="center" />


        <Button
            android:id="@+id/ppw_storelocation_btntmpstore"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:background="@drawable/shape"
            android:text="取消"
            android:textColor="@color/seesimilarcolorGhostWhite" />

    </LinearLayout>

</LinearLayout>

在PopWindow里面加入Spinner的显示

OnIteSelectedListener的事件内容可以自己写,我这里是程序中用到的。


到上面这样我本来觉得就可以结束了,可是在调试的过程中发现一点击Spinner框程序直接崩掉了,如下图

报错为Unable to add window -- token android.view.ViewRootImpl$W@538d624c is not valid; is your activity running? 出现这个问题后在度娘上查了一下,说是在PopWindow中加入Spinner默认的下拉列表是不行的,如果用对话框的方式可以实现,那我们就改一下对话框方法

如上图加上红框中的这一句后,我们再看看效果


关于Spinner中选择对齐的问题

上面这样我们就完美解决了在PopWindow中使用Spinner的问题,不过看上面的动图会发现,Spinner中的选项字体在最左边,这样并不好看,但是我们在Spinner中明明设置了gravity=center,如下图

查找资料后发现我们用系统自带的Simple_spinner_item这样的方法,使用字体居中不起作用

想要解决这个问题,需要我们重写ArrayAdapter里面的方法,下面是这个的核心方法

代码语言:javascript
复制
         private View setCentered(View view) {
                TextView textView = view.findViewById(android.R.id.text1);
                textView.setGravity(Gravity.CENTER);
                return view;
            }

通过这们来我们就如视频刚开始一样,完美解决了Spinner字体居中的问题

最后放一下显示PopWindow的那一段完整代码

InitStorePopWindow

代码语言:javascript
复制
    //组托的界面
    private void InitStorePopWindow() {
        //popup的显示View
        final View popupWindowView=getLayoutInflater().inflate(R.layout.ppw_storelocation, null);
        //定义popupwindow
        final PopupWindow popstore=new PopupWindow(popupWindowView, 600, 550, true);
        //设定可以选择及显示位置
        popstore.setFocusable(true);
        popstore.showAtLocation(fragwhinhead.getView(), Gravity.CENTER, 0, 0);
        popstore.showAsDropDown(fragwhinhead.getView());

        popupWindowView.setFocusable(true);
        popupWindowView.setFocusableInTouchMode(true);
        //返回键关闭popwindow
        popupWindowView.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_BACK) {
                    popstore.dismiss();
                    return true;
                }
                return false;
            }
        });

        //文本框事件
        EditText edtinput=popupWindowView.findViewById(R.id.ppw_storelocation_edt);
        edtinput.setInputType(InputType.TYPE_CLASS_TEXT);
        edtinput.requestFocusFromTouch();
        edtinput.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (KeyEvent.KEYCODE_BACK == event.getKeyCode()) {
                    popstore.dismiss();
                    return true;
                }
                return false;
            }
        });
        edtinput.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                //检测到回车键后进入事件
                if (KeyEvent.KEYCODE_ENTER == event.getKeyCode()) {
                    switch (event.getAction()) {
                        case KeyEvent.ACTION_UP:
                            String code=v.getText().toString();
                            if (code.equals("")) {
                                return true;
                            }

                            //检测库位是否正常
                            //todo 网络检测条码
                            whinretrofitApi api=new whinretrofitApi();
                            api.setbase(WhInActivity.this, mSysCfg);
                            api.setInfCallBack(WhInActivity.this);
                            api.setretrofittype(PostValue.StoreLocation);
                            api.execute(code);


                            popstore.dismiss();

                            return true;
                        default:
                            return true;
                    }
                }
                return false;
            }
        });


        //入库类型
        Spinner spinner=popupWindowView.findViewById(R.id.ppw_storelocation_spinner);
        String[] spinneritem={"生产入库", "采购入库", "调拨入库", "退货入库"};
        ArrayAdapter<String> spinnerAdapter=new ArrayAdapter<String>(WhInActivity.this,
                android.R.layout.simple_spinner_item, spinneritem){

            private View setCentered(View view) {
                TextView textView = view.findViewById(android.R.id.text1);
                textView.setGravity(Gravity.CENTER);
                return view;
            }

            @NonNull
            @Override
            public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
                return setCentered(super.getView(position, convertView, parent));
            }

            @Override
            public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
                return setCentered(super.getDropDownView(position, convertView, parent));
            }
        };
        //下拉样式
        spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(spinnerAdapter);
        spinner.setSelection(ordersel);
        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                ordersel=position;
                nowPallet.Remark=parent.getItemAtPosition(position).toString();
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
                ordersel=1;
                parent.setSelection(ordersel);
                nowPallet.Remark=parent.getSelectedItem().toString();
            }
        });

        //临时托盘按钮
        Button btn=popupWindowView.findViewById(R.id.ppw_storelocation_btntmpstore);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                popstore.dismiss();
            }
        });

    }

-END-

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-04-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微卡智享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档