< p > 可能的重复: < br / > 如何以编程方式关闭/隐藏Android软键盘? < / p >
首先,我已经看到这线程。我尝试了那里给出的被接受的方法,但没有一个对我有效。
我的应用程序有两个屏幕。
在我的第一个屏幕中,我想让用户名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()
}
嗯,启动时键盘不显示。我的设计非常需要键盘。
现在来看第二个页面。我提到过,这里有一个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);
}
}
为了简化
我的问题是在这两种情况下我得到的都是完全相反的结果。希望以前有人遇到过这个问题。顺便说一下,我正在模拟器和HTC Desire手机上测试。
#最终结果
在我朋友们的帮助下,我把它弄好了。
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提供的,事实上,他链接到另一个SOF线程,这是我以前没有见过的。但有趣的是,这个解决方案是在我开始时引用的线程中给出的。我还没试过
它出来是因为它在一个所有其他帖子都有很多投票的线程中零票。
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
对我来说,第二个解决方案看起来很好,所以我决定坚持用它。
此外,@Dyarish的回答包含了一个聪明的hack,使用ScrollView在EditText下面,使EditText的焦点。我还没试过,但应该能行。
2. 在活动开始时隐藏键盘
只有一个答案对我有用,它是由@Dyarish提供的。解决方法就是使用 用于包含EditTexts的布局的XML focusableInTouchMode设置。<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的答案。所以我要把赏金颁给他。谢谢我所有的朋友
谁试图帮助我。