zoukankan      html  css  js  c++  java
  • android EditText 软键盘 一些总结

    看一个manifest中Activity的配置,如果这个页面有EditText,并且我们想要进入这个页面的时候默认弹出输入法,可以这样设置这个属相:android:windowSoftInputMode=stateVisible,这样就会默认弹起输入法,当然还有别的办法。

    1. <activity android:name=".ui.login" 
    2.                   android:configChanges="orientation|keyboardHidden|locale" 
    3.                   android:screenOrientation="portrait" 
    4.                   android:windowSoftInputMode="stateVisible|adjustPan" > 
    5.         </activity>  

    Android EditText 不弹出输入法总结

    方法一:

    在AndroidMainfest.xml中选择哪个activity,设置windowSoftInputMode属性为adjustUnspecified|stateHidden

    例如:

    1. <activity android:name=".Main" 
    2. android:label="@string/app_name" 
    3. android:windowSoftInputMode="adjustUnspecified|stateHidden" 
    4. android:configChanges="orientation|keyboardHidden"> 
    5. < intent-filter> 
    6. < action android:name="android.intent.action.MAIN" /> 
    7. < category android:name="android.intent.category.LAUNCHER" /> 
    8. < /intent-filter> 
    9. < /activity>  

    方法二:

    让EditText失去焦点,使用EditText的clearFocus方法

    例如:

    1. EditText edit=(EditText)findViewById(R.id.edit); 
    2. edit.clearFocus();  

    方法三:

    强制隐藏Android输入法窗口

    例如:

    1. EditText edit=(EditText)findViewById(R.id.edit); 
    2. InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
    3. imm.hideSoftInputFromWindow(edit.getWindowToken(),0);  

    2.EditText始终不弹出软件键盘

    例:

    1. EditText edit=(EditText)findViewById(R.id.edit); 
    2. edit.setInputType(InputType.TYPE_NULL);  

    研究了下android中焦点Focus和弹出输入法的问题。在网上看了些例子都不够全面,在这里全面总结下。

    一:EditText为什么会默认弹出输入法?

    同样的代码,碰到有EditText控件的界面时有的机子会弹出输入法,有的机子不会弹出。不好意思,这问题我也一头雾水,谁知道可以告诉我,否则我就把这个问题留下来,以后研究android 源码时再搞个清楚。但是...我有解决方案。

    二:默认弹出和默认关闭输入法的解决方案。

    1.默认关闭,不至于进入Activity就打开输入法,影响界面美观。

    ①在布局文件中,在EditText前面放置一个看不到的LinearLayout,让他率先获取焦点:

    1. <LinearLayout 
    2. android:focusable="true" 
    3. android:focusableInTouchMode="true" 
    4. android:layout_width="0px" 
    5. android:layout_height="0px"/>  

    ②方法二:先看一个属性android:inputType:指定输入法的类型,int类型,可以用|选择多个。取值可以参考:android.text.InputType类。取值包括:text,textUri,

    phone,number,等.

    Android SDK中有这么一句话“If the given content type is TYPE_NULL then a soft keyboard will not be displayed for this text view”,

    先将EditText的InputType改变为TYPE_NULL,输入法就不会弹出.然后再设置监听,再重新设置它的InputType.

    1. editText.setOnTouchListener(new OnTouchListener() { 
    2.                 public boolean onTouch(View v, MotionEvent event) {  
    3.                     // TODO Auto-generated method stub  
    4.                     int inType = editText.getInputType(); // backup the input type  
    5.                     editText.setInputType(InputType.TYPE_NULL); // disable soft input      
    6.                     editText.onTouchEvent(event); // call native handler      
    7.                     editText.setInputType(inType); // restore input type     
    8.                     return true;                      
    9.                 }  
    10.             });  

    2.默认弹出。有时候按照需求可能要求默认弹出输入法。方案如下:

    1. EditText titleInput = (EditText) findViewById(R.id.create_edit_title); 
    2. titleInput.setFocusable(true); 
    3.  titleInput.requestFocus(); 
    4.  onFocusChange(titleInput.isFocused()); 
    5. private void onFocusChange(boolean hasFocus) 
    6. final boolean isFocus = hasFocus; 
    7. (new Handler()).postDelayed(new Runnable() { 
    8. public void run() { 
    9. InputMethodManager imm = (InputMethodManager) 
    10. titleInput.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); 
    11. if(isFocus) 
    12. imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); 
    13. else 
    14. imm.hideSoftInputFromWindow(titleInput.getWindowToken(),0); 
    15. }, 100); 
    16. }  

    我觉得因为在Android的主线程中对UI的操作无效,所以必须在Handler中实现弹出输入法的操作。

    三:关于焦点和输入法的个人理解

    获取焦点是获取焦点,弹输入法是弹输入法。获取焦点后并不一定会弹出输入法,在网上搜了一圈,主流回答是“还有就是已开启界面就是focus的text的话有可能也是不行的,UI渲染是需要时间的”......

    由于对源码不懂,我对这一点也没有个全面的认识。只能将焦点和输入法分成两块来处理。焦点的打开和关闭特别简单。

    焦点的获取:

    1. titleInput.setFocusable(true); 
    2. titleInput.requestFocus();  

    焦点的取消:

    1. titleInput.setFocusable(false);  

    四:关于经常调用的处理软键盘的函数如下:

    1、打开输入法窗口:

    1. InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
    2. // 接受软键盘输入的编辑文本或其它视图 
    3. imm.showSoftInput(submitBt,InputMethodManager.SHOW_FORCED);  

    2、关闭出入法窗口

    1. InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
    2. inputMethodManager.hideSoftInputFromWindow(OpeListActivity.this.getCurrentFocus().getWindowToken(), 
    3. InputMethodManager.HIDE_NOT_ALWAYS); 
    4. //接受软键盘输入的编辑文本或其它视图 
    5. inputMethodManagerwww.2cto.com 
    6. .showSoftInput(submitBt,InputMethodManager.SHOW_FORCED);  

    3、如果输入法打开则关闭,如果没打开则打开

    1. InputMethodManager m=(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
    2. m.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);  

    4、获取输入法打开的状态

    1. InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
    2. boolean isOpen=imm.isActive();  

    isOpen若返回true,则表示输入法打开

    原文地址:http://mobile.51cto.com/aprogram-403138.htm

  • 相关阅读:
    HDU 1022 Train Problem I
    HDU 1702 ACboy needs your help again!
    HDU 1294 Rooted Trees Problem
    HDU 1027 Ignatius and the Princess II
    HDU 3398 String
    HDU 1709 The Balance
    HDU 2152 Fruit
    HDU 1398 Square Coins
    HDU 3571 N-dimensional Sphere
    HDU 2451 Simple Addition Expression
  • 原文地址:https://www.cnblogs.com/zyppac/p/3850682.html
Copyright © 2011-2022 走看看