Programmatically Hide/Show Android Soft Keyboard
Possible Duplicate:
Close/hide the Android Soft Keyboard
首先,我已经看到了这条线。我试着接受那里的方法……但没有什么对我有用……
我的应用程序中有两个屏幕。
- 第一个有两个edittext-一个用于用户名,一个用于密码
- 第二个具有一个ListView和一个EditText,用于筛选列表框
在我的第一个屏幕中,我希望用户名edittext集中在启动上,并且键盘应该是可见的..这是我的实现(通过删除不必要/不相关的代码来简化)。
AppLogLog.xml1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingLeft="20dip" android:paddingRight="20dip"> <EditText android:id="@+id/username" android:singleLine="true" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="Username" android:imeOptions="actionDone" android:inputType="text" android:maxLines="1"/> <EditText android:id="@+id/password" android:password="true" android:singleLine="true" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="Password" /> </LinearLayout> |
Java语言
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class AppLogin extends Activity{ private EditText mUserNameEdit = null; private EditText mPasswordEdit = null; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.app_login); mUserNameEdit = (EditText) findViewById(R.id.username); mPasswordEdit = (EditText) findViewById(R.id.password); /* code to show keyboard on startup.this code is not working.*/ InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(mUserNameEdit, InputMethodManager.SHOW_IMPLICIT); }//End of onCreate() } |
嗯,启动时键盘没有显示。我的设计非常需要一个键盘。
现在转到第二页……我已经说过我有一个ListView和EditText……我希望我的键盘在启动时隐藏起来,只有当用户触摸EditText时才会出现……你能相信吗?无论我尝试了什么,当我加载活动时,软键盘都会显示出来..我无法隐藏它..
应用程序列表视图.xml1 2 3 4 5 6 7 8 9 | <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <EditText android:id="@+id/filter_edittext" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="Search" android:inputType="text" android:maxLines="1"/> <ListView android:id="@id/android:list" android:layout_height="fill_parent" android:layout_weight="1.0" android:layout_width="fill_parent" android:focusable="true" android:descendantFocusability="beforeDescendants"/> </LinearLayout> |
爪哇
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class MyListActivity extends ListActivity{ private EditText mfilterEditText; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.app_list_view); mFilterEditText = (EditText) findViewById(R.id.filter_edittext); InputMethodManager imm = InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(mFilterEditText.getWindowToken(), 0); } } |
简化
我的问题是,我在这两个场合都变得完全相反……希望有人以前遇到过这个问题……顺便说一句,我正在模拟器和HTC的欲望电话上测试……
最终结果在这里所有朋友的帮助下,我让它工作起来了。
1。启动时显示键盘
有两个答案对我有用。@capdroid提供的一个,它使用一个处理程序并将其延迟发布。
1 2 3 4 5 6 7 8 |
第二个答案是由@dyarish提供的,事实上他链接到了另一个so线程,我以前从未见过。但是有趣的是,这个解决方案是在我开始引用的线程中给出的。我还没试过因为在所有其他职位都拥有大量选票的情况下,它的选票为零,愚蠢至极。
1 | getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); |
对我来说,第二个解决方案看起来很好,所以我决定坚持下去……但第一个确实有效。另外,@dyarish的答案也包含了一个巧妙的技巧,即在edittext下面使用滚动视图来给edittext提供焦点……但我没有尝试过,但它应该可以工作。不过不干净……
2。在活动开始时隐藏键盘
只有一个答案对我有效,由@dyarish提供。解决方案是使用对于包含EditText的布局,在XML中进行FocusableIntouchmode设置。
1 2 3 4 5 6 7 8 9 | <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:focusableInTouchMode="true"> <EditText android:id="@+id/filter_edittext" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="Search" android:inputType="text" android:maxLines="1"/> <ListView android:id="@id/android:list" android:layout_height="fill_parent" android:layout_weight="1.0" android:layout_width="fill_parent" android:focusable="true" android:descendantFocusability="beforeDescendants"/> </LinearLayout> |
不管怎样,在这两种情况下,我最终都使用了戴里什的答案。所以我要给他赏金……谢谢所有的朋友谁想帮我……
更新2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | @Override protected void onResume() { super.onResume(); mUserNameEdit.requestFocus(); mUserNameEdit.postDelayed(new Runnable() { @Override public void run() { // TODO Auto-generated method stub InputMethodManager keyboard = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); keyboard.showSoftInput(mUserNameEdit, 0); } },200); //use 300 to make it run when coming back from lock screen } |
我非常努力,找到了一个解决办法…每当一个新的活动开始时,键盘就不能打开,但我们可以在onresume中使用runnable,它工作正常,所以请尝试此代码并检查…
更新1
在您的EDOCX1[0]中添加此行
1 | mUserNameEdit.requestFocus(); |
这条线在你的
1 | listview.requestFocus()' |
检查完应用程序后,如果它不起作用,请将此行添加到您的
1 2 | </activity> </activity> |
原始答案
1 | InputMethodManager imm = (InputMethodManager)this.getSystemService(Service.INPUT_METHOD_SERVICE); |
用于隐藏键盘
1 | imm.hideSoftInputFromWindow(ed.getWindowToken(), 0); |
用于显示键盘
1 | imm.showSoftInput(ed, 0); |
聚焦于EditText
1 | ed.requestFocus(); |
其中Ed是EditText
将此项添加到代码
ie:在你的应用程序中,列出u view.xml文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:focusableInTouchMode="true"> <EditText android:id="@+id/filter_edittext" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="Search" android:inputType="text" android:maxLines="1"/> <ListView android:id="@id/android:list" android:layout_height="fill_parent" android:layout_weight="1.0" android:layout_width="fill_parent" android:focusable="true" android:descendantFocusability="beforeDescendants"/> </LinearLayout> |
-------------编辑:使键盘在启动时出现----------------
这是为了使它们在启动时在用户名编辑文本框上显示。我所做的就是在.xml文件的底部添加一个空的滚动视图,这将第一个editText放在焦点位置,并弹出键盘。我承认这是一个黑客,但我假设你只是想让这个工作。我已经测试过了,而且效果很好。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | <?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="wrap_content" android:paddingLeft="20dip" android:paddingRight="20dip"> <EditText android:id="@+id/userName" android:singleLine="true" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="Username" android:imeOptions="actionDone" android:inputType="text" android:maxLines="1" /> <EditText android:id="@+id/password" android:password="true" android:singleLine="true" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="Password" /> <ScrollView android:id="@+id/ScrollView01" android:layout_height="fill_parent" android:layout_width="fill_parent"> </ScrollView> </LinearLayout> |
如果你在寻找一个更有说服力的解决方案,我发现这个问题可能会帮你解决,它不像上面的解决方案那么简单,但可能是一个更好的解决方案。我还没有测试过,但它显然有效。我认为这与你尝试过的解决方案类似,但这对你来说不起作用。
希望这就是你要找的。
干杯!
试试这个代码。
显示软键盘:
1 2 3 4 5 | InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); if(imm != null){ imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0); } |
用于隐藏软键盘-
1 2 3 4 5 | InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); if(imm != null){ imm.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY); } |
你在第一个窗口里试过
为了躲在第二个窗口,使用
编辑:如果它仍然不起作用,那么你可能把它放错了地方。覆盖
1 2 3 4 5 6 | @override public void onFinishInflate() { /* code to show keyboard on startup */ InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(mUserNameEdit, InputMethodManager.SHOW_IMPLICIT); } |