首先我已经看到了这个线程。我尝试了那里给出的公认方法,但对我没有任何作用。
我的应用程序中有两个屏幕。
- 第一个有 2 个 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()
}
好吧,键盘在启动时没有显示。我的设计非常需要一个键盘。
现在到第二页。正如我已经提到的,我在那里有一个 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);
}
}
简化
- 在登录页面(第一页)我希望我的键盘在启动时可见。
- 在 SecondPage 上,我希望首先隐藏键盘,仅在用户触摸 editText 时出现
而我的问题是我在这两种情况下都得到了完全相反的结果。希望以前有人遇到过这个问题。顺便说一句,我正在模拟器和 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 的答案包含一个巧妙的技巧,即在 EditText 下方使用 ScrollView 来为 EditText 提供焦点。但是我没有尝试过,但它应该可以工作。虽然不整齐。
2.在活动开始时隐藏键盘
只有一个答案对我有用,由@Dyarish 提供。解决方案是在 XML 中为包含 EditTexts 的布局使用 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 的答案。所以我将赏金奖励给他。感谢所有其他试图帮助我的朋友。