以编程方式隐藏/显示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); } }
简化
- 在login页面(首页)我希望我的键盘在启动时可见
- 在第二页,我想让键盘先被隐藏,只有当用户触摸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); }