使用addView添加EditText

2017-12-06  本文已影响0人  reverse_Android

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

首先我们得先创建一个动态添加的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

上一篇下一篇

猜你喜欢

热点阅读