事件触发EditText焦点和自动弹出键盘以及InputMeth

2016-10-23  本文已影响5148人  AiPuff

通常在一个布局中,给EditText设置焦点方式如下 ,在Activity启动后会自动将焦点定位到第一个EditText并且键盘自动弹起。
方式一,在layout中:

android:focusable="true" android:focusableInTouchMode="true"
方式二,在代码中:

edit.setFocusable(true);

如果不需要启动自动弹出键盘,则在manifest文件的Activity标签设置属性android:windowSoftInputMode="stateAlwaysHidden" (或者stateHidden|adjustResize)
根据需要设置来限制不自动弹出键盘。

总结如下:

当我们点击某个话题的选项卡,会弹出一个popupwindow,或开启新的ACTIVITY。

里面有诸如 评论、回复的选项,你点击这个选项的时候,

需要定位到EditText编辑框,并且自动弹出输入法。可以考虑如下方法:

// 获取编辑框焦点
editText.setFocusable(true);

//打开软键盘
InputMethodManager imm = (InputMethodManager)MainActivity.this.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);

//关闭软键盘
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);

但是如果要在某个事件触发后要弹出键盘(如从语音切换到文字操作时),需要自动弹出键盘。
具体方法如下:

edit.requestFocus(); InputMethodManager imm = (InputMethodManager) edit.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput(0, InputMethodManager.SHOW_FORCED);
以上代码主要分两部分:第一步通过requestFocus()方法取得焦点(setFocusable(true)不知道什么原因无效);
第二步是强制性的弹出键盘,由于焦点在editText上,所以输入就正常了。

InputMethodManager输入法简介

正文
  一、结构
public final class InputMethodManager extends Object
Java.lang.Object
android.view.inputmethod.InputMethodManager
  二、类概述
  整个输入法框架(IMF)结构的核心API,应用程序之间进行调度和当前输入法交互。你可以用Context.getSystemService()取得这一接口的实例。
  架构总述(Architecture Overview)
  输入法框架(IMF)共有三个主要部分:
  * 输入法管理器,管理各部分的交互。它是一个客户端API,存在于各个应用程序的context中,用来沟通管理所有进程间交互的全局系统服务。
  * 输入法(IME) ,实现一个允许用户生成文本的独立交互模块。系统绑定一个当前的输入法。使其创建和生成,决定输入法何时隐藏或者显示它的UI。同一时间只能有一个IME运行。
  * 客户应用程序,通过输入法管理器控制输入焦点和IME的状态。一次只能有一个客户端使用IME。
  应用程序(Applications)
  大多数情况下,使用标准TextView或其子类的应用程序只要做少量工作就可以让软键盘(soft input methods)正常工作。你要注意的是:
  * 正确设置你的可编辑文本视图inputType,这样输入法有足够的上下文帮助用户向其输入文本。
  * 当输入法显示时妥善处理隐藏屏幕空间。理想的情况下应用程序应处理窗口变小,如必要你可以利用系统执行平移窗口。你应在活动(activity)中设置windowSoftInputMode属性或调整创建窗口的相应值,以便系统决定平移或缩放(它会尝试自动调整但可能出错)。
  * 你还可以通过相同的windowSoftInputMode控制窗口的首选软键盘状态(打开、关闭等)。
  通过API可以与IMF及其IME交互实现更细致的控制,如显示或输入区域,用户选取某输入法等。
  当你编写自己的文本编辑器的时候,你要实现onCreateInputConnection(EditorInfo)以返回你的InputConnection的接口实例,用来允许IME和你的文本编辑域来交互。
    输入法(Input Methods)
  一个输入法(IME)是Service(服务)的实现,通常继承自 InputMethodService。IME提供核心的 InputMethod接口,尽管提供InputMethod通常是由InputMethodService来处理,而IME的实现只需要处理更高层的API。
更多信息参阅InputMethodService。
    安全(Security)
  输入法关系到许多安全问题,因其基本不受约束地驱动UI并监视用户输入。Android输入法框架还允许调度第三方IME,所必须小心以限制他们的选择和相互作用。
  以下是IMF背后安全架构的要点:

android如何调用显示和隐藏系统默认的输入法
1.调用显示系统默认的输入法
方法一、
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(m_receiverView(接受软键盘输入的视图(View)),InputMethodManager.SHOW_FORCED(提供当前操作的标记,SHOW_FORCED表示强制显示));
方法二、
InputMethodManager m=(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);m.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); (这个方法可以实现输入法在窗口上切换显示,如果输入法在窗口上已经显示,则隐藏,如果隐藏,则显示输入法到窗口上)
2.调用隐藏系统默认的输入法
((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(WidgetSearchActivity.this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); (WidgetSearchActivity是当前的Activity)
3.获取输入法打开的状态
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);boolean isOpen=imm.isActive();isOpen若返回true,则表示输入法打开

**1、//隐藏软键盘 **
((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(WidgetSearchActivity.this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
**2、//显示软键盘,控件ID可以是EditText,TextView **
((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE)).showSoftInput(控件ID, 0);
3、不自动弹出键盘:
带有EditText控件的在第一次显示的时候会自动获得focus,并弹出键盘,如果不想自动弹出键盘,有两种方法:
方法一:在mainfest文件中把对应的activity设置
android:windowSoftInputMode="stateHidden" 或者android:windowSoftInputMode="stateUnchanged"。
方法二:可以在布局中放一个隐藏的TextView,然后在onCreate的时候requsetFocus。
注意TextView不要设置Visiable=gone,否则会失效
,可以在布局中放一个隐藏的TextView,然后在onCreate的时候requsetFocus。
注意TextView不要设置Visiable=gone,否则会失效
<TextView
android:id="@+id/text_notuse"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="true"
android:focusableInTouchMode="true" />

TextView textView = (TextView)findViewById(R.id.text_notuse);
textView.requestFocus();

Android软键盘学习InputMethodManager
当我们在Android提供的EditText中单击的时候,会自动的弹出软键盘,其实对于软键盘的控制我们可以通过InputMethodManager这个类来实现。我们需要控制软键盘的方式就是两种一个是像EditText那样当发生onClick事件的时候出现软键盘,还有就是当打开某个程序的时候自动的弹出软键盘。

public class InputMethodManagerTest extends Activity implements OnClickListener{  
    private Button button;  
      
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        // TODO Auto-generated method stub  
        super.onCreate(savedInstanceState);  
        LinearLayout layout=new LinearLayout(this);  
        LinearLayout.LayoutParams layoutParams=new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);  
        button=new Button(this);  
        button.setId(123);  
        button.setText("Hello GaoMatrix");  
        button.setOnClickListener(this);  
        layout.addView(button, layoutParams);  
        setContentView(layout);  
          
        /** 
         * 用一个定时器控制当打开这个Activity的时候就出现软键盘 
         */  
        Timer timer=new Timer();  
        timer.schedule(new TimerTask() {  
            @Override  
            public void run() {  
                InputMethodManager inputMethodManager=(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);  
                inputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);  
            }  
        }, 2000);  
    }  
    /** 
     * 当单击事件的时候触发显示软键盘 
     */  
    @Override  
    public void onClick(View v) {  
        InputMethodManager inputMethodManager=(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);  
        inputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);  
    }  
}

这个InputMethodManager类里面的toggleSoftInput方法的API中的解释是:
This method toggles the input method window display. If the input window is already displayed, it gets hidden. If not the input window will be displayed.
这个方法在界面上切换输入法的功能,如果输入法出于现实状态,就将他隐藏,如果处于隐藏状态,就显示输入法。
而对于第二中方式进入Activity就自动显示软键盘,在一个定时器中,也就是在一个线程中执行,只不过是延迟2秒执行,原因是在onCreate函数中Android程序未将屏幕绘制完成。

上一篇 下一篇

猜你喜欢

热点阅读