■EditText编辑框

1.概述:可编辑的文本框。

2.颜色背景:
         (1)要去掉默认背景:(设置背景)
                 方法一:设置新的背景,android:background="#00000000"
                 方法二:设置背景为空,android:background="@null"
         (2)提示信息文字的颜色:
                  android:textColorHint="#ffff00" // 默认为灰色
         (3)被选中文字的底色:
                  android:textColorHighlight="#cccccc" // 默认为蓝色
3.光标:
          (1)默认有光标,有时只是光标颜色跟背景颜色一样而“被隐蔽了”。
          (2)光标可改为图标:属性textCursorDrawable。
          (3)将光标移到文本的末端:
                           方法一:
                                        1)et.setText(text);
                                        // 在当前界面所有EditText设置默认文本(或获取焦点)之后调用
                                        2)et.requestFocus();
                           方法二:
                                        1)et.setText(text); 
                                        2)et.setSelection(text.length());)
          (4)让光标移到点击的位置:
                    etInput.requestFocusFromTouch();
          (5)隐藏光标:
                  android:cursorVisible="false"

4.焦点:
         (1)同个界面中,唯一的EditText默认先自动获得焦点;
                 若同个界面中,有多个EditText,则默认第一个自动获得焦点。

         (2)强行获取焦点:

                 含有<requestFocus />EditText的最先获得焦点,格式如下:

                       <EditText 某某属性配置> 

                             <requestFocus />

                       </EditText>

                 注意:<requestFocus/>作为子标签(不是属性):


         (3)强行移除焦点:


                 方法一:在该EditText的父级控件或父控件中的另外一个控件,


                              也可以找父级控件外面的控件,

                              设置给该控件设置如下属性即可:

                                    android:focusable="true"  


                                    android:focusableInTouchMode="true"。

                方法二:在该EditText上方(同一个父控件内部)加个隐藏的LinearLayout。


                             <LinearLayout


                                 android:layout_width="0px"


                                 android:layout_height="0px"


                                 android:focusable="true"


                                 android:focusableintouchmode="true">


                            </LinearLayout>


                            <EditText 某某属性配置 /> 

5.输入类型的限定:


android:inputType :指定输入法的类型,用“|”选择多个。

6.控制软键盘:


(1)键盘若是开着则关闭;若是关着则弹出。


             控制代码如下:


             public class KeyBoardUtils{


                      private KeyBoardUtils() {}

                      /**键盘若是开着则关闭;若是关着则弹出*/

                      public static void colseInputMethod(Context context) {


                         InputMethodManager imm = (InputMethodManager) context

                            .getSystemService(Context.INPUT_METHOD_SERVICE);

                         if (imm.isActive()) {


                                 imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT,


                                     InputMethodManager.HIDE_NOT_ALWAYS);


                         }


                     }


             }


            处理示例代码如下:


            tvNavSearch.setOnFocusChangeListener(new View.OnFocusChangeListener() {


               @Override


               public void onFocusChange(View v, boolean hasFocus) {


                   if (!hasFocus) {


                   KeyBoardUtils.colseInputMethod(NavMapAty.this);


                   }


               }


            });

(2)只会关闭软键盘。
             public class KeyBoardUtils{

                      private KeyBoardUtils() {}

              /**


               * 只会关闭软键盘


               * @param context 上下文


               * @param view    依附的view


               */


               public static void colseInputMethod(Context context, View view) {


                InputMethodManager imm = (InputMethodManager) context

                   .getSystemService(Context.INPUT_METHOD_SERVICE);

                if (imm.isActive()){


                 imm.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

                 }

               }


             }

        调用代码如下:

        KeyBoardUtils.colseInputMethod(thisAty,rvEdit);



(3)点击输入框外面位置即关闭键盘。


@Override


public boolean dispatchTouchEvent(MotionEvent ev) {


    switch (ev.getAction()) {


        case MotionEvent.ACTION_DOWN:


            View view = getCurrentFocus();


            // 调用方法判断是否需要隐藏键盘


            KeyBoardUtils.hideKeyboard(ev, view, AboutKeyBoardActivity.this);


            break;


        default:


            break;


    }


    return super.dispatchTouchEvent(ev);


}


/**


 * 根据传入控件的坐标和用户的焦点坐标,判断是否隐藏键盘。


 * 若点击的位置在控件外,则隐藏键盘;


 * 若点击的位置在控件内,则不隐藏键盘。


 *


 * @param view  控件view


 * @param event 焦点位置


 * @return 是否隐藏


 */


public static void hideKeyboard(MotionEvent event, View view, Activity activity) {


    try {


        if (view != null && view instanceof EditText) {


            int[] location = {0, 0};


            view.getLocationInWindow(location);


            int left = location[0], top = location[1], right = left


                    + view.getWidth(), bootom = top + view.getHeight();


            // 判断焦点位置坐标是否在空间内,如果位置在控件外,则隐藏键盘


            if (event.getRawX() < left || event.getRawX() > right


                    || event.getY() < top || event.getRawY() > bootom) {


                // 隐藏键盘


                IBinder token = view.getWindowToken();


                InputMethodManager inputMethodManager = (InputMethodManager) activity


                        .getSystemService(Context.INPUT_METHOD_SERVICE);


                inputMethodManager.hideSoftInputFromWindow(token,


                        InputMethodManager.HIDE_NOT_ALWAYS);


            }


        }


    } catch (Exception e) {


        e.printStackTrace();


    }


}



7.软键盘右下角(Enter键)的图标:


(1)键盘图标的显示:

android:imeOptions :指定输入法窗口中的回车键的功能图标。

可选值为normal,


actionUnspecified, // 未指定==》“回车”(EditorInfo.IME_ACTION_UNSPECIFIED)


actionNone,//没有动作==》“”(EditorInfo.IME_ACTION_NONE)


actionGo,//去往==》“去往/开始/前往”(EditorInfo.IME_ACTION_GO)


actionSearch,//搜索,“搜索图标/搜索”......


actionSend,//发送,“发送”......


actionNext,//下一个,“下一个”......


actionDone。//完成,“完成”......



方法一,Xml中:


设置下面两个属性中的一个即可使这个属性imeOptions生效:


1 将singleLine设置为true


2 将inputType设置为text


<EditText


    android:id="@+id/editText"


    android:layout_width="200dp"


    android:layout_height="wrap_content"


    android:imeOptions="actionSearch"


    android:inputType="text"


    android:singleLine="true"


    />


方法二,Java中:


et.setImeOptions(EditorInfo.IME_ACTION_SEARCH);  


et.setInputType(EditorInfo.TYPE_CLASS_TEXT);  


et.setSingleLine(true);  



(2)键盘图标的监听:

在代码中用et.setOnEditorActionListener方法,比如搜索:

        et.setOnEditorActionListener(new OnEditorActionListener() {  


            @Override  


            public boolean onEditorAction(TextView v, int actionId,  


                    KeyEvent event) {  


                if (actionId == EditorInfo.IME_ACTION_SEARCH) {


                    // 执行搜索任务


                }  


                return false;  


            }  


        });  






8.监听输入变化:


可应用于显隐清除图标和输入匹配。


/*


 * 搜索目的地(商家位置)时,监听搜素框文本变化,改变搜索按钮文本


 */


class searchTextWatcher implements TextWatcher {


 @Override


 public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        //text  输入框中改变前的字符串信息  
        //start 输入框中改变前的字符串的起始位置  
        //count 输入框中改变前后的字符串改变数量一般为0  
        //after 输入框中改变后的字符串与起始位置的偏移量  

 }


 @Override


 public void onTextChanged(CharSequence s, int start, int before, int count) {

        //text  输入框中改变后的字符串信息  
        //start 输入框中改变后的字符串的起始位置  
        //before 输入框中改变前的字符串的位置 默认为0  
        //count 输入框中改变后的一共输入字符串的数量  

 }


 @Override


 public void afterTextChanged(Editable edit ) {

        //edit  输入结束呈现在输入框中的信息  

if (edit .toString().isEmpty()) {


   tvNavSearchCancle.setText("取消"); // 这时也可以隐藏清空图标


  } else {


   tvNavSearchCancle.setText("搜索"); // 这时也可以显示清空图标


  }


 }


}



9.监听焦点变化:


可应用于确定输入完成或退出当前界面后执行某些动作。


et.setOnFocusChangeListener(


        new View.OnFocusChangeListener() {


         @Override


         public void onFocusChange(View view, boolean b) {


          if (!b) {


           // 失去焦点的操作


          }


         }


        });



10.动态限制显示或隐藏密码:


1).在xml设置:


    <EditText 


        android:id="@+id/etPwd "


        android:layout_width="wrap_content"


        android:layout_height="wrap_content"


        android:password="true"/>


2).在Java设置:


// 设置为明文


etPwd.setTransformationMethod(HideReturnsTransformationMethod.getInstance());


// 设置为密文


etPwd.setTransformationMethod(PasswordTransformationMethod.getInstance());



11.限制字数:


(1)在xml中,可这样:android:maxLength=180;


(2)在Java中,可这样:etInput.setFilters(new InputFilter[]{new InputFilter.LengthFilter(100)});



12.限定输入指定字符:


比如:只能输入“1234567890"和"/”。


<EditText


    ......


    android:digits="1234567890/"


    ....../>