以编程方式打开软键盘


115

我有一个没有子小部件的活动,相应的xml文件是,

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/myLayout"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:focusable="true"
>
</LinearLayout>

我想在活动开始时以编程方式打开软键盘。到目前为止,我尝试过的是

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if (inputMethodManager != null) {
        inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    }

给我一些指导。


嗨,vignetsh,但是没有任何TextView的软键盘打开的需求是什么?
milind 2011年

实际上,我正在尝试在该活动中使用键侦听器,为此,我需要这样做。
Vignesh

您所做的是正确的。我不确定为什么您看不到键盘。我曾经使用此代码一次启动键盘,而无需对editText进行任何用户操作,并且操作成功。
Vinoth,2011年

嗨Vinoth,我已经完全更改了DSouza所发布的代码,并且我也更新了我的问题,因此请检查是否有任何我需要更改的内容。
Vignesh

Answers:


145

我使用以下几行在onclick事件中手动显示软键盘,并且键盘可见。

InputMethodManager inputMethodManager =
    (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInputFromWindow(
    linearLayout.getApplicationWindowToken(),
    InputMethodManager.SHOW_FORCED, 0);

但是在活动打开时我仍然无法打开它,那么对此有什么解决方案吗?


@YosiTaguri,如果您正在处理活动,则要优雅得多。那碎片呢?两种答案均获得+1
S.Thiongane 2014年

如果必须在具有编辑文本的对话框上打开键盘该怎么办?怎么做?
Seema

5
@Vignesh:如果要在启动活动时实现此代码,则在打开键盘时需要给予一些延迟(例如500毫秒)。
温尼特·萨克森纳

@vinitsaxena感谢您的宝贵意见
Vignesh

我不确定,但是我尝试获取任何视图,例如TextView并追加诸如myTextView.post(new Runnable(){public void run(){//此处是您的方法}})之类的侦听器;创建此视图时,这意味着所有屏幕现在都可见,您可以调用所需的任何内容
Aleksey Timoshchenko

120

在清单文件中,尝试将以下内容添加到<activity>要在活动开始时显示键盘的:

android:windowSoftInputMode="stateVisible"

这将导致活动开始时键盘变得可见。

有关更多选项,请查阅文档


3
希望我可以更频繁地为这个答案
投票,

您如何以编程方式执行此操作?我只希望键盘在某些情况下自动显示。
phreakhead

1
我有像这样的链接链接输入对话框,如何在活动时而不是提示时显示键盘?感谢<code> InputMethodManager inputMethodManager =(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);如果(inputMethodManager!= null){inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED,0); } <code>
shareef

7
他说“以编程方式”。
Mert Akcakaya

2
它对我不起作用。而是这样做:android:windowSoftInputMode =“ stateAlwaysVisible”
Rendicahya 2013年

33

请遵循以下代码。我相信您的问题会得到解决。

if (imm != null){
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
   } 

嗨,我只是将您的代码粘贴到onCreate函数中,但是我的活动仍然没有变化,如果要我粘贴代码,我将在注释中粘贴。
Vignesh

如果您想访问软键盘,请告诉我,以便我解决您的问题。请发送代码给我。...如果可能的话
AndroidDanger 2011年

我想为我的活动设置onKeyboardActionListener,除了线性布局外别无其他。
Vignesh

请看上面我的问题,其中用您为我提供的内容编辑了代码。
Vignesh

该活动仅用于键盘操作,我想听每个按下的键(使用onKeyboardActionListener),然后将其同时传递给本地服务器
Vignesh

25

这是作品

<activity
    ...
    android:windowSoftInputMode="stateVisible" >
</activity>

要么

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

2
感谢您以编程方式设置此设置-此方法有效,而InputMethodManager hack无效。
马丁·维斯尼

17

我只需要在非常精确的时间内露出键盘即可。这对我有用!谢谢贝尼特斯。

    private Handler mHandler= new Handler();

并且在非常精确的时刻:

    mHandler.post(
    new Runnable() {
        public void run() {
            InputMethodManager inputMethodManager =  (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
            inputMethodManager.toggleSoftInputFromWindow(yourEditText.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0);
            yourEditText.requestFocus();
        }
    }); 

此解决方案在onResume()中为我工作,对延迟发布操作进行了一些修改: postDelayed( runnable, 500 /* msec */ );
AVIDeveloper 2013年

1
我建议将其放在ViewTreeObserver回调中,以便在第一个布局上调用它,以避免不得不等待任意时间。它应该更安全/响应更快。
加百利

仅此解决方案对我有用。我之前使用过以前的方法,但是对于最新的OS来说是不幸的,但处理程序是可行的解决方案。
MD。Shafiul Alam Biplob

12

我使用以下几行在onclick事件中手动显示软键盘。

public void showKeyboard(final EmojiconEditText ettext){
          ettext.requestFocus();
          ettext.postDelayed(new Runnable(){
            @Override public void run(){
              InputMethodManager keyboard=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
              keyboard.showSoftInput(ettext,0);
            }
          }
        ,200);
        }

9

将其放在onResume方法中:

findViewById(R.id.root_view_of_your_activity_layout).post(
new Runnable() {
    public void run() {
        InputMethodManager inputMethodManager =  (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
        inputMethodManager.toggleSoftInputFromWindow(yourEditText.getApplicationWindowToken(),     InputMethodManager.SHOW_FORCED, 0);
        yourEditText.requestFocus();
    }
});

之所以需要runnable,是因为当操作系统触发onResume方法时,您不能确保所有视图都在绘制,因此从根布局调用的post方法使其等待直到所有视图准备就绪。


1
我在DialogFragment中有一个SearchView,并且对话框第一次出现时,SearchView才有焦点...但是除非用户触摸,否则键盘没有抬起。我们曾经尝试仅使用showSoftInput,还使用OnResume ALONE中的toggleSoftInputFromWindow ...甚至在SearchView的OnFocusChangeListener中...但这些都不起作用,因为它们似乎在打开并绘制窗口之前就已启动.....在OnResume中使用此post事件最终解决了它。
lepert

8

似乎这正在工作

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_patientid);

        editText = (EditText)findViewById(R.id.selectPatient);
        //editText.requestFocus(); //works without that

    }

@Override
    protected void onResume() {

        findViewById(R.id.selectPatient).postDelayed(
        new Runnable() {
            public void run() {
                 editText.requestFocus();
                InputMethodManager inputMethodManager =  (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                inputMethodManager.showSoftInput(editText,InputMethodManager.SHOW_IMPLICIT);
            }
        },100);
        super.onResume();
    }

似乎这样做更好:在清单中:

<application>
    <activity
        android:name="com.doodkin.myapp.ReportActivity"
        android:label="@string/title_activity_report"
        android:screenOrientation="sensor" 
        android:windowSoftInputMode="stateHidden" > // add this or stateVisible
    </activity>
</application>

似乎清单在android 4.2.2中工作,但在android 4.0.3中不工作


8

在活动的onCreate方法或片段的onActivityCreated

....
view.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
        @Override
        public boolean onPreDraw() {
            view.removeOnPreDrawListener(this);
            InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

            // !Pay attention to return `true`
            // Chet Haase told to 
            return true;
        }
    });

6

我曾使用过这种方式来以编程方式显示软键盘,这对我来说可以防止启动键盘时自动调整屏幕大小。

在清单中:

<activity android:name="XXXActivity" android:windowSoftInputMode="adjustPan">
</activity>

在XXXActvity中:

EditText et =  (EditText))findViewById(R.id.edit_text);  
  Timer timer = new Timer();
            TimerTask task = new TimerTask() {

                @Override
                public void run() {
                    InputMethodManager inputMethodManager=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                    inputMethodManager.toggleSoftInputFromWindow(et.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0);

                }
            };
            timer.schedule(task, 200);

我认为这将节省其他人搜索此问题的时间。


可以,但是即使您退出该应用程序,键盘仍然可见,并且一旦再次打开该应用程序关闭了键盘,则该键盘不会出现
nulll

直到现在我都没有遇到这个问题。我认为这是设备问题。
Noundla Sandeep

为什么需要计时器?您能否添加链接以更深入?
nulll

6

科特林

fun hideKeyboard(activity: Activity) {
    val view = activity.currentFocus
    val methodManager = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(view != null)
    methodManager.hideSoftInputFromWindow(view!!.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
}

private fun showKeyboard(activity: Activity) {
    val view = activity.currentFocus
    val methodManager = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(view != null)
    methodManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
}

爪哇

public static void hideKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();
    InputMethodManager methodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    assert methodManager != null && view != null;
    methodManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}

private static void showKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();
    InputMethodManager methodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    assert methodManager != null && view != null;
    methodManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
}

3
InputMethodManager inputMethodManager=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

3

我将其作为单例使用:

public static void showSoftKeyboard(final Context context, final EditText editText) {
        try {
            editText.requestFocus();
            editText.postDelayed(
                    new Runnable() {
                        @Override
                        public void run() {
                            InputMethodManager keyboard = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
                            keyboard.showSoftInput(editText, 0);
                        }
                    }
                    , 200);
        } catch (NullPointerException npe) {
            npe.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

在您的活动中使用它,例如:

showSoftKeyboard(this, yourEditTextToFocus);

非常感谢您提供了有关如何使用函数以及函数本身的简短摘要。它完全按照我的需要工作!
乍得威尔逊

3

这有效:

private static void showKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}

您可以这样调用此方法:

showKeyboard(NameOfActivity.this);

2

InputMethodManager.SHOW_FORCED不是一个好选择。如果使用此设置,则应管理隐藏键盘状态。我的建议是这样的;

    public void showSoftKeyboard(View view) {
    InputMethodManager inputMethodManager = (InputMethodManager) getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE);
    view.requestFocus();
    inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
}

同样,您可以集中精力获取带有参数的视图(通常是EditText)。这使其成为更有用的功能

有关InputMethodManager.SHOW_IMPLICIT和SHOW_FORCED的更多信息;InputMethodManager


1

这是必需的源代码:

public static void openKeypad(final Context context, final View v) 
 {
new Handler().postDelayed(new Runnable() 
{
    @Override
    public void run() 
    {
        InputMethodManager inputManager =   (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE); 
        inputManager.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT);    
        Log.e("openKeypad", "Inside Handler");
    }
},300);}

有关详细信息,请通过此链接。这对我有帮助。 https://github.com/Nikhillosalka/Keyboard/blob/master/README.md


1
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

在onResume()中使用以上代码打开软键盘


1

与@ShimonDoodkin的答案类似,这是我在片段中所做的。

https://stackoverflow.com/a/29229865/2413303

    passwordInput.postDelayed(new ShowKeyboard(), 300); //250 sometimes doesn't run if returning from LockScreen

哪里ShowKeyboard

private class ShowKeyboard implements Runnable {
    @Override
    public void run() {
        passwordInput.setFocusableInTouchMode(true);
        passwordInput.requestFocus();            
        getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        ((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(passwordInput, 0);
    }
}

输入成功后,我还要确保隐藏键盘

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE))
                    .hideSoftInputFromWindow(getView().getWindowToken(), 0);

1
public final class AAUtilKeyboard {

public static void openKeyboard(final Activity activity, final EditText editText) {
    final InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    if (imm != null) {
        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
    }
}

public static void hideKeyboard(final Activity activity) {
    final View view = activity.getCurrentFocus();
    if (view != null) {
        final InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
        if (imm != null) {
            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
        }
    }
}

0

答案已经太多了,但除此之外,对我没有任何帮助

inputMethodManager.showSoftInput(emailET,InputMethodManager.SHOW_FORCED);

我用showSoftInputSHOW_FORCED

我的活动有

 android:windowSoftInputMode="stateVisible|adjustResize"

希望这可以帮助某人


0

在您的基本活动中发布此方法,并在其他活动中使用它,例如超级按钮

public void openKeyboard() {
    InputMethodManager imm =
            (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if (imm != null) {
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.