我的应用程序中有两个屏幕。
在我的第一个屏幕中,我希望用户名 EditText 专注于启动并且键盘应该是可见的 。这是我的实现(通过删除不必要的/不相关的代码来简化)。
<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>
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 时出现 。你相信吗? 当我加载活动时, 我尝试过的任何软键盘都会显示。我无法隐藏它。
<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>
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 的答案包含一个巧妙的技巧,即在 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 的答案。所以我将赏金奖励给他。感谢所有其他试图帮助我的朋友。
将此添加到您的代码android:focusableInTouchMode="true"将确保您的键盘不会在您的编辑文本框启动时出现。您想将此行添加到包含 EditTextBox 的线性布局中。你应该能够玩这个来解决你的两个问题。我已经对此进行了测试。简单的解决方案。
android:focusableInTouchMode="true"
即:在您的 app_list_view.xml 文件中
------------------ 编辑:使键盘出现在启动时 ----------
这是为了让他们的键盘在启动时出现在用户名edittextbox上。我所做的只是将一个空的 Scrollview 添加到 .xml 文件的底部,这会将第一个 edittext 置于焦点并弹出键盘。我承认这是一个 hack,但我假设你只是想让它工作。我已经测试过了,它工作正常。
<?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>
如果您正在寻找一个更有说服力的解决方案,我发现这个问题可能会对您有所帮助,它不像上面的解决方案那么简单,但可能是一个更好的解决方案。我没有测试过它,但它显然有效。我认为它类似于您尝试过的解决方案,但对您不起作用。
希望这是您正在寻找的。
干杯!