Android show softboard与showSoftInput不工作?

我创build了一个简单的应用程序来testing以下function。 当我的活动启动时,需要打开软键盘才能启动。

我的代码不起作用?

我已经尝试清单中的各种“状态”设置和代码中的不同标志InputMethodManager(imm)。

我已经在AndroidManifest.xml中包含了该设置,并且在唯一活动的onCreate中显式调用了该设置。

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.mycompany.android.studyIme" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="7" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".StudyImeActivity" android:label="@string/app_name" android:windowSoftInputMode="stateAlwaysVisible"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> 

主要布局(main.xml)…

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <EditText android:id="@+id/edit_sample_text" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="@string/hello" android:inputType="textShortMessage" /> </LinearLayout> 

…和代码…

 public class StudyImeActivity extends Activity { private EditText mEditTextStudy; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mEditTextStudy = (EditText) findViewById(R.id.edit_study); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(mEditTextStudy, InputMethodManager.SHOW_FORCED); } } 

Solutions Collecting From Web of "Android show softboard与showSoftInput不工作?"

当活动启动看起来,键盘最初显示,但被其他东西隐藏,因为下面的工作(但实际上是一个肮脏的解决方法):

第一种方法

 InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); editText.postDelayed(new Runnable() { @Override public void run() { editText.requestFocus(); imm.showSoftInput(editText, 0); } }, 100); 

第二种方法

在onCreate上创build活动时启动它

 new Handler().postDelayed(new Runnable() { @Override public void run() { // InputMethodManager inputMethodManager=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); // inputMethodManager.toggleSoftInputFromWindow(EnterYourViewHere.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0); if (inputMethodManager != null) { inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED,0); } } }, 200); 

第三种方法将代码添加到清单中的活动标签。 它将在启动时显示键盘,并将第一个焦点设置为您的愿望视图。

 android:windowSoftInputMode="stateVisible" 

嘿,我希望你仍然在寻找答案,因为我testing了我的代码时发现它。 这里是代码:

 InputMethodManager imm = (InputMethodManager)_context.getSystemService(Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput(0, 0); 

这是我回答的问题: android – 按需显示软键盘

这太微妙了,它是犯罪的。 这适用于没有硬式滑出式键盘的手机。 带有硬键盘的手机在此呼叫时不会自动打开。 我的LG和老的Nexus One没有键盘 – 因此,当活动启动时(这是我想要的),软键盘打开,但具有滑出式键盘的MyTouch和HTC G2手机不打开软键盘,直到我在硬键盘closures的情况下触摸编辑区域。

这与我在硬盘键盘手机上工作:

 editText1.requestFocus(); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0); 

这个答案也许很晚,但是对我来说它是完美的。 也许它有助于某人:)

 public void showSoftKeyboard(View view) { if (view.requestFocus()) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); boolean isShowing = imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT); if (!isShowing) getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); } } 

取决于你的需要,你可以使用其他标志

 InputMethodManager.SHOW_FORCED WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); 

我的代码有切换,但不是postDelayed。 我已经试过postDelayed为ShowSoftInput没有成功,我已经尝试了你的build议的解决scheme。 在我决定增加延迟时间之前,我正要放弃它作为又一个失败的潜在解决scheme。 它一直工作到200毫秒,在这一点上,它不工作,至less不在物理电话上。 所以,在你可怜的android开发者抛弃这个答案之前,试着延长一个成功的解决scheme。 增加一些较慢的手机可能会付出代价。 感谢堆,正在这个小时工作。

显示软键盘是一个大问题。 我搜查了很多,最终得出结论。 感谢这给了一些线索的答案: https : //stackoverflow.com/a/16882749/5903344

问题:

通常我们在初始化视图的时候调用showSoftInput。 在活动中,这主要是onCreate,在片段onCreateView。 为了显示键盘,IMM需要使focsedView处于活动状态。 这可以使用IMM的isActive(view)方法进行检查。 如果我们在创build视图的时候调用showSoftInput,那么这个视图很可能不会被IMM激活。 这就是为什么有时延迟了50-100毫秒的showSoftInput是有用的。 但是,这仍然不能保证在100ms之后视图将变为活动的。 所以在我的理解中,这又是一个黑客。

解:

我使用以下类。 这将保持每隔100毫秒运行,直到成功显示键盘。 它在每个迭代中执行各种检查。 一些检查可以停止可运行,一些检查可能会在100 ms后发布。

 public class KeyboardRunnable extends Runnable { // ----------------------- Constants ----------------------- // private static final String TAG = "KEYBOARD_RUNNABLE"; // Runnable Interval private static final int INTERVAL_MS = 100; // ----------------------- Classes ---------------------------// // ----------------------- Interfaces ----------------------- // // ----------------------- Globals ----------------------- // private Activity parentActivity = null; private View targetView = null; // ----------------------- Constructor ----------------------- // public KeyboardRunnable(Activity parentActivity, View targetView) { this.parentActivity = parentActivity; this.targetView = targetView; } // ----------------------- Overrides ----------------------- // @Override public void run() { // Validate Params if ((parentActivity == null) || (targetView == null)) { Dbg.error(TAG, "Invalid Params"); return; } // Get Input Method Manager InputMethodManager imm = (InputMethodManager) parentActivity.getSystemService(Context.INPUT_METHOD_SERVICE); // Check view is focusable if (!(targetView.isFocusable() && targetView.isFocusableInTouchMode())) { Dbg.error(TAG, "Non focusable view"); return; } // Try focusing else if (!targetView.requestFocus()) { Dbg.error(TAG, "Cannot focus on view"); Post(); } // Check if Imm is active with this view else if (!imm.isActive(targetView)) { Dbg.error(TAG, "IMM is not active"); Post(); } // Show Keyboard else if (!imm.showSoftInput(targetView, InputMethodManager.SHOW_IMPLICIT)) { Dbg.error(TAG, "Unable to show keyboard"); Post(); } } // ----------------------- Public APIs ----------------------- // public static void Hide(Activity parentActivity) { if (parentActivity != null) { InputMethodManager imm = (InputMethodManager) parentActivity.getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(parentActivity.findViewById(android.R.id.content).getWindowToken(), 0); } else { Dbg.error(TAG, "Invalid params to hide keyboard"); } } // ----------------------- Private APIs ----------------------- // protected void Post() { // Post this aftr 100 ms handler.postDelayed(this, INTERVAL_MS); } } 

要使用这个,只需创build这个类的一个实例。 把父活动和targetView传递给键盘input和焦点。 然后使用Handler发布实例。