Quantcast
Channel: CSDN博客移动开发推荐文章
Viewing all articles
Browse latest Browse all 5930

EditText控件的TextWatcher接口实现和其他控件的联动

$
0
0

使用TextWathcer限制EditText控件输入字符个数。

页面布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="pp.org.vincent.glibdemo.MainActivity">



    <!--   使用TextWathcer实现EditeText和TextView同步   -->
    <LinearLayout
        android:id="@+id/ll_synsa"
        android:layout_below="@+id/iv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_alignParentStart="true"
        android:layout_alignParentEnd="true">
        <EditText
            android:id="@+id/ET"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"/>
        <TextView
            android:id="@+id/IV"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"/>
    </LinearLayout>

    <!--   使用TextWathcer限制输入字符个数   -->
    <LinearLayout
        android:id="@+id/ll_limit"
        android:layout_below="@+id/ll_synsa"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_alignParentBottom="true"
        android:layout_alignParentStart="true">
        <EditText
            android:id="@+id/ET_limit"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"/>
        <TextView
            android:id="@+id/IV_limit_show"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"/>
    </LinearLayout>
</RelativeLayout>
editText_limit= (EditText) findViewById(R.id.ET_limit);
        textView_limit=(TextView)findViewById(R.id.IV_limit_show);

        //限定这个edittext的字符数量为10个
        editText_limit.addTextChangedListener(new TextWatcher() {
            public CharSequence oldString;
            private int editStart ;
            private int editEnd ;

            /**
             * s 是edittext更改前的字符串引用(注意是引用),参数表示从下标start的count个字符串被被后来的after个字符代替
             * 从s中可以寻找到被替换的字符串
             * @param s    代表更改前的字符串 S
             * @param start  字符串更改的位置
             * @param count  更改字符个数
             * @param after  代替的新字符个数
             */
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                Toast.makeText(MainActivity.this,"beforeTextChanged:"+s,Toast.LENGTH_SHORT).show();
                oldString =  s;
                //注意这个oldString只是指向edittext文本实例的一个引用,并不是一个new出来的String实例
                //所以当edittext原来是空,输入一个字符这里输出的oldString为空,length()为0;但是
                //afterTextChanged接口方法里面他会获得更改后的文本,所以oldString所指向的实例就被改变了。可以看到
                //length()为1
                Toast.makeText(MainActivity.this,"oldString.length()"+oldString.length()+"",Toast.LENGTH_LONG).show();
            }

            /**
             * 这个方法在edittext文本框文本改变后调用
             *  s是更改后的字符串,表示从start下标开始的count个字符代替原来的before个字符
             *  从这个回调函数可以获取新插入字符串内容
             * @param s   s 表示更改后的新字符
             * @param start   插入的字符串在s串中start下标开始的一个字符串,有count个长度
             * @param before
             * @param count
             */

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                /*Toast.makeText(MainActivity.this,
                        "new string: "+s.subSequence(start,start+count) +"start :"+start+"count: "+count+"before: "+before, Toast.LENGTH_SHORT)
                        .show();*/
                textView_limit.setText(s);
            }

            /**
             * 这个方法在edittext文本框文本改变后调用
             * 任何edittext文本的改变都会回调这个方法,在这个方法里面可以改变edittext的文本,但是要注意
             * 防止死循环。
             * @param s
             */
            @Override
            public void afterTextChanged(Editable s) {

                editStart = editText_limit.getSelectionStart();//返回光标当前的起止位置

                editEnd = editText_limit.getSelectionEnd();//返回光标当前的结束位置,但是和上面的一样啊,
                Toast.makeText(MainActivity.this,"aftTeChang oldString.length()"+oldString.length()+""+":"+oldString.toString(),Toast.LENGTH_LONG).show();
                //限制不能超过10个字符,oldString指向edittext文本框文本实例的引用
                if (oldString.length() > 10) {
                    Toast.makeText(MainActivity.this,
                            "你输入的字数已经超过了限制!"+"editStart: "+editStart+"editEnd: "+editEnd, Toast.LENGTH_SHORT)
                            .show();
                    s=s.delete(editStart-1, editEnd);//删除多出来的那个字符
                    int tempSelection = editStart;
                    editText_limit.setText(s);
                    editText_limit.setSelection(tempSelection);
                }
            }
        });

将edittext中的内容同步到textview

 //edittext同步到textview
        editText.addTextChangedListener(new TextWatcher() {


            /**
             *
             * @param s  改变字符串的原来情况
             * @param start 内容被改变的开始位置
             * @param count 原始文字被删除的个数   总start和count可以获取到删除的字符串,这个删除的字符串被after个字符替代
             * @param after 新添加的字符串
             */
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                Log.d(TAG,"string: "+s+"Start: "+start+"count: "+count+"after: "+after);
            }

            /**
             *
             * @param s 改变后的新文本
             * @param start 改变的开始位置
             * @param before 原来文字删除的字符
             * @param count 总共增加了 几个字符,总start开始的count个字符替换了原来的before个字符
             *              start和count结合从s中获取新添加的字符内容
             */
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                Log.d(TAG,s.toString());
                //用新的文本同步到textview控件
                if (!TextUtils.isEmpty(editText.getText()))
                {
                    textView.setText(editText.getText().toString());
                }
                else {                    //Toast.makeText(MainActivity.this,"edittext is null",Toast.LENGTH_LONG).show();
                    textView.setText("");
                }

            }

            @Override
            public void afterTextChanged(Editable s) {
                //s 改变后的最终内容
                Log.d(TAG,"afterTextChanged :"+s.toString());
                if (TextUtils.isEmpty(editText.getText())){
                    textView.setText("");
                }
            }
        });
作者:JQ_AK47 发表于2016/10/22 22:17:35 原文链接
阅读:84 评论:0 查看评论

Viewing all articles
Browse latest Browse all 5930

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>