美文网首页
使用addView添加EditText

使用addView添加EditText

作者: reverse_Android | 来源:发表于2017-12-06 14:23 被阅读0次

    大家好,菜鸡作者又来了,今天这篇文章,是分享下作者自己做过的一个需求,以免自己以后忘记。
    话不多说,直接进入整题。

    首先我们得先创建一个动态添加的item布局,代码如下:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:focusable="true"
        android:focusableInTouchMode="true">
    
        <LinearLayout
            android:padding="10dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
    
        <TextView
            android:id="@+id/item_tv"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:textColor="#000000"
            android:text="我是第一条第一个"/>
    
            <EditText
                android:id="@+id/item_et"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"/>
    
        </LinearLayout>
    
        <LinearLayout
            android:padding="10dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
    
            <EditText
                android:id="@+id/item_et1"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"/>
    
            <TextView
                android:id="@+id/item_tv1"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:textColor="#000000"
                android:text="我是第一条第二个"/>
    
        </LinearLayout>
    
    </LinearLayout>
    

    然后再来看看主布局的代码:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context="com.xjx.addview.MainActivity">
    
        <LinearLayout
            android:id="@+id/main_linear"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"/>
    
        <Button
            android:id="@+id/main_btn_add"
            android:layout_gravity="center"
            android:layout_marginTop="10dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="添加View"/>
    
        <Button
            android:id="@+id/main_btn_get"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginTop="10dp"
            android:text="获取所有Edit的值"/>
    
    </LinearLayout>
    

    布局文件写完后,接下来就是java代码了,动态添加addView的方法,

        //动态添加一个item的方法
        private void addItemView() {
            mView = new View(MainActivity.this);
            mView = View.inflate(this, R.layout.item_main, null);
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
                    LinearLayout.LayoutParams.MATCH_PARENT);
            mTextView1 = mView.findViewById(R.id.item_tv);
            mEditText1 = mView.findViewById(R.id.item_et);
            mTextView2 = mView.findViewById(R.id.item_tv1);
            mEditText2 = mView.findViewById(R.id.item_et1);
            mLinearLayout.addView(mView, params);
            //给当前添加的View设置一个tag,这一步很重要。如果没有这个tag,我们后面无法取出view
            mView.setTag(position);
            //将tag和当前生成的view存入集合
            mapView.put(position, mView);
            //让tag自增一下,因为tag在这还承担着当前view序号的作用
            position++;
            mTextView1.setText("我是第" + position + "条" + "第1个TextView");
            mTextView2.setText("我是第" + position + "条" + "第2个TextView");
            //设置长按删除
            setLongDelete();
        }
    

    在这个方法里,我们要做的就是通过和用户交互,动态的添加一条item,代码里的注释已经说的很详细了,(毕竟作者的文章就是给菜鸟新手程序猿看的,大神可以略过。。。)
    长按删除当前item的方法

        private void setLongDelete() {
            mView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(final View view) {
                    new AlertDialog.Builder(MainActivity.this)
                            .setTitle("提示")
                            .setMessage("确定要删除吗?")
                            .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    //根据点击的当前View,获取上面存储的tag,这个view就是onLongClick(View view)里的这个view,直接拿来用,他可以判断出当前点击的哪一个view
                                    int positionView = (int) view.getTag();
                                    //通过map集合把刚获得的tag放进去,从而获取到当前要删除的view
                                    mLinearLayout.removeView(mapView.get(positionView));
                                    //移除掉这个tag
                                    mapView.remove(positionView);
                                    //当map集合删除掉最后一条时,会初始化tag和view
                                    if (mapView.size() == 0) {
                                        position = 0;
                                        editText.clear();
                                        mLinearLayout.removeAllViews();
                                    }
                                    Toast.makeText(getApplicationContext(), "删除成功", Toast.LENGTH_LONG).show();
                                }
                            })
                            .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    return;
                                }
                            }).show();
                    return false;
                }
            });
        }
    

    其中这个方法中,作者认为较为不好理解的就是 int positionView = (int) view.getTag();这句代码,因为水平太菜,当初这里想不通,作者也是看了下这里的源码才理解的,(大家可以看看源码,有助于理解)这句代码只要大家理解了,以后再做类似的功能就是手到擒来了。

    接下来就是要获取用户给添加的item中EditText输入的值的问题了。
    这个问题也很简单,大家只要搞清楚布局.getChildCount()这个方法就行了,其中布局可以是任意的布局,线性,相对,帧。他的方法的意思就是获取当前布局内有多少个一级子布局,(只能获取它自身的子布局,并不能获取它子布局的子布局),一句话,他只能知道他有多少个儿子,但是却不能知道他儿子有几个儿子(当爷爷的不能知道孙子有几个。。。)代码如下:

        private boolean getEditItem() {
            //getChildCount()此方法可以获取到当前的linearLayout里含有多少个view
            for (int i = 0; i < mLinearLayout.getChildCount(); i++) {
                //将每一个view遍历出来,然后findViewById后,就可以获取EditText的值
                View childAtView = mLinearLayout.getChildAt(i);
                mEditText1 = childAtView.findViewById(R.id.item_et);
                mEditText2 = childAtView.findViewById(R.id.item_et1);
                if (!mEditText1.getText().toString().equals("") && !mEditText2.getText().toString().equals("")) {
                    editText.add(mEditText1.getText().toString());
                    editText.add(mEditText2.getText().toString());
                } else {
                    Toast.makeText(this, "第" + (i + 1) + "个item的EditText没有完整填写", Toast.LENGTH_SHORT).show();
                    return false;
                }
            }
            return true;
        }
    

    此处我用的是一个boolean类型的返回值,项目后面会用到,不想要的同学,把boolean改掉就行了。好了这个项目就算完结了。下次再见。
    本文源码地址:https://github.com/reverseAndroid/simple-addView

    相关文章

      网友评论

          本文标题:使用addView添加EditText

          本文链接:https://www.haomeiwen.com/subject/vttwbxtx.html