关于java:以编程方式隐藏/显示Android软键盘

Programmatically Hide/Show Android Soft Keyboard

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Close/hide the Android Soft Keyboard

首先,我已经看到了这条线。我试着接受那里的方法……但没有什么对我有用……

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

  • 第一个有两个edittext-一个用于用户名,一个用于密码
  • 第二个具有一个ListView和一个EditText,用于筛选列表框

在我的第一个屏幕中,我希望用户名edittext集中在启动上,并且键盘应该是可见的..这是我的实现(通过删除不必要/不相关的代码来简化)。

AppLogLog.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<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>

Java语言

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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时才会出现……你能相信吗?无论我尝试了什么,当我加载活动时,软键盘都会显示出来..我无法隐藏它..

应用程序列表视图.xml

1
2
3
4
5
6
7
8
9
<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>

爪哇

1
2
3
4
5
6
7
8
9
10
11
12
13
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);
   }
}

简化

  • 在登录页(第一页)上,我希望我的键盘在启动…
  • 在第二页,我希望先隐藏键盘,然后再显示当用户触摸EditText时
  • 我的问题是,我在这两个场合都变得完全相反……希望有人以前遇到过这个问题……顺便说一句,我正在模拟器和HTC的欲望电话上测试……

    最终结果

    在这里所有朋友的帮助下,我让它工作起来了。

    1。启动时显示键盘

    有两个答案对我有用。@capdroid提供的一个,它使用一个处理程序并将其延迟发布。

    1
    2
    3
    4
    5
    6
    7
    8
    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线程,我以前从未见过。但是有趣的是,这个解决方案是在我开始引用的线程中给出的。我还没试过因为在所有其他职位都拥有大量选票的情况下,它的选票为零,愚蠢至极。

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

    对我来说,第二个解决方案看起来很好,所以我决定坚持下去……但第一个确实有效。另外,@dyarish的答案也包含了一个巧妙的技巧,即在edittext下面使用滚动视图来给edittext提供焦点……但我没有尝试过,但它应该可以工作。不过不干净……

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

    只有一个答案对我有效,由@dyarish提供。解决方案是使用对于包含EditText的布局,在XML中进行FocusableIntouchmode设置。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <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>

    不管怎样,在这两种情况下,我最终都使用了戴里什的答案。所以我要给他赏金……谢谢所有的朋友谁想帮我……


    更新2

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    @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
        }

    我非常努力,找到了一个解决办法…每当一个新的活动开始时,键盘就不能打开,但我们可以在onresume中使用runnable,它工作正常,所以请尝试此代码并检查…

    更新1

    在您的EDOCX1[0]中添加此行

    1
    mUserNameEdit.requestFocus();

    这条线在你的AppList.java

    1
    listview.requestFocus()'

    检查完应用程序后,如果它不起作用,请将此行添加到您的AndroidManifest.xml文件中。

    1
    2
    </activity>
    </activity>

    原始答案

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

    用于隐藏键盘

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

    用于显示键盘

    1
     imm.showSoftInput(ed, 0);

    聚焦于EditText

    1
     ed.requestFocus();

    其中Ed是EditText


    将此项添加到代码android:focusableInTouchMode="true"将确保您的小键盘在启动时不会出现在编辑文本框中。您希望将此行添加到包含EditTextBox的线性布局中。你应该能够用这个来解决你的两个问题。我已经测试过了。简单的解决方案。

    ie:在你的应用程序中,列出u view.xml文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <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>

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

    这是为了使它们在启动时在用户名编辑文本框上显示。我所做的就是在.xml文件的底部添加一个空的滚动视图,这将第一个editText放在焦点位置,并弹出键盘。我承认这是一个黑客,但我假设你只是想让这个工作。我已经测试过了,而且效果很好。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    <?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>

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

    希望这就是你要找的。

    干杯!


    试试这个代码。

    显示软键盘:

    1
    2
    3
    4
    5
    InputMethodManager imm = (InputMethodManager)
                                     getSystemService(Context.INPUT_METHOD_SERVICE);
    if(imm != null){
            imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
        }

    用于隐藏软键盘-

    1
    2
    3
    4
    5
    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()并显示/隐藏在那里。

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