以编程方式隐藏/显示Android软键盘

可能重复:
closures/隐藏Android软键盘

首先,我已经看到了这个线程。 我尝试了在那里接受的方法..但没有为我工作..

我有两个屏幕在我的应用程序。

  • 首先有两个EditText的 – 一个用户名和一个密码
  • 第二个有一个ListView和一个EditText – 来过滤listView

在我的第一个屏幕上,我想用户名EditText重点启动和键盘应该是可见的 ..这是我的实现(通过删除不必要/不相关的代码简化)..

app_login.xml

<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> 

AppLogin.java

 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() } 

那么键盘在启动时就不显示了 。 而且我的devise非常需要键盘。

现在到第二页 .. 已经说过,我有一个listView和EditText那里.. 我想我的键盘隐藏在启动时才出现,当用户触摸editText ..你相信吗? 无论我尝试软键盘显示当我加载活动 ..我无法隐藏它..

app_list_view.xml

 <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> 

AppList.java

 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); } } 

简化

  1. 在login页面(首页)我希望我的键盘在启动时可见
  2. 在第二页,我想让键盘先被隐藏,只有当用户触摸editText时才会出现

而我的问题是,我得到了两个正好相反 …希望有人面临这个问题之前.. BTW我在模拟器和HTC Desire手机testing..

最终结果

好吧,我在这里的所有朋友的帮助下工作。

1.在启动时显示键盘

两个答案为我工作。 一个由@CapDroid提供的,这是使用处理程序,并将其延迟..

 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); } },50); 

第二个答案是由@Dyarish提供的,实际上他连接到另一个SO线程,这是我以前没有见过的。 但有趣的是,这个解决scheme是在我在开始引用的线程中给出的。 而且我还没有尝试过,因为它在所有其他post都拥有大量票数的线程中没有投票。愚蠢的举动

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

对我来说,第二个解决scheme看起来很整齐,所以我决定坚持下去。但是第一个解决scheme肯定是有效的。 另外@ Dyarish的答案包含一个聪明的黑客使用下面的EditText ScrollView给EditText的焦点..但我没有尝试过,但它应该工作。 虽然不是很整齐

2.在活动开始时隐藏键盘

只有一个答案为我工作,由@Dyarish提供。 解决方法是在xml中使用focusableInTouchMode设置来显示包含editText的布局。 这个伎俩

 <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> 

无论如何,我最终在两种情况下都使用了Dyarish的答案。 所以我给他奖赏..谢谢所有其他朋友谁试图帮助我..

将此添加到您的代码android:focusableInTouchMode="true"将确保您的键盘不会在启动时出现在您的编辑文本框中。 您想要将此行添加到包含EditTextBox的线性布局中。 你应该可以玩这个来解决你的问题。 我已经testing过了 解决scheme简单

即:在你的app_list_view.xml文件中

 <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> 

—————— 编辑:使键盘出现在启动时 ———————–

这是为了使他们的键盘在启动时出现在用户名edittextbox上。 我所做的只是在.xml文件底部添加一个空的滚动视图,这将第一个编辑文本放在焦点上,popup键盘。 我承认这是一个黑客,但我认为你只是想要这个工作。 我testing过了,它工作正常。

 <?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> 

如果你正在寻找一个更有说服力的解决scheme,我发现这个问题可能会帮助你,它不像上面的解决scheme那么简单,但可能是一个更好的解决scheme。 我没有testing它,但它显然工作。 我认为这与您尝试过的解决scheme类似,但对您不起作用。

希望这是你在找什么。

干杯!

更新2

 @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 } 

我试了很难,发现了一个解决scheme…每当一个新的活动开始,然后键盘无法打开,但我们可以在onResume中使用Runnable ,它工作正常,所以请尝试此代码,并检查…

更新1

在你的AppLogin.java添加这一行

 mUserNameEdit.requestFocus(); 

并在你的AppList.java这一行

 listview.requestFocus()' 

在这之后检查你的应用程序是否工作不正常,然后在你的AndroidManifest.xml文件中添加这一行

 <activity android:name=".AppLogin" android:configChanges="keyboardHidden|orientation"></activity> <activity android:name=".AppList" android:configChanges="keyboard|orientation"></activity> 

原来的答案

  InputMethodManager imm = (InputMethodManager)this.getSystemService(Service.INPUT_METHOD_SERVICE); 

为隐藏键盘

  imm.hideSoftInputFromWindow(ed.getWindowToken(), 0); 

为显示键盘

  imm.showSoftInput(ed, 0); 

专注于EditText

  ed.requestFocus(); 

ed是EditText

试试这个代码,

为显示Softkeyboard –

 InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); if(imm != null){ imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0); } 

隐藏SoftKeyboard –

 InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); if(imm != null){ imm.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY); } 

希望这可以帮助。

您是否在第一个窗口中尝试了InputMethodManager.SHOW_IMPLICIT

并隐藏在第二个窗口使用InputMethodManager.HIDE_IMPLICIT_ONLY

编辑:

如果它仍然不工作,那么可能是你把它放在错误的地方。 覆盖onFinishInflate()并在那里显示/隐藏。

 @override public void onFinishInflate() { /* code to show keyboard on startup */ InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(mUserNameEdit, InputMethodManager.SHOW_IMPLICIT); }