可能的重复: 如何以编程方式关闭/隐藏Android软键盘?

首先,我已经看过这条线索了。我尝试了那里给出的被接受的方法,但没有一个对我有效。

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

第一个有2个EditText -一个用户名和一个密码 第二个有一个ListView和一个EditText -用来过滤 列表视图

在我的第一个屏幕中,我想让用户名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的回答包含了一个聪明的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的答案。所以我要把赏金颁给他。谢谢我所有的朋友 试图帮助我的人。


当前回答

你试过InputMethodManager吗?SHOW_IMPLICIT在第一个窗口中。

和隐藏在第二个窗口使用InputMethodManager。HIDE_IMPLICIT_ONLY

编辑: 如果它仍然不工作,那么很可能你把它放在错误的地方。重写onfinishinflation()并在那里显示/隐藏。

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

其他回答

试试这段代码。

显示软键盘:

InputMethodManager imm = (InputMethodManager)
                                 getSystemService(Context.INPUT_METHOD_SERVICE);
if(imm != null){
        imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
    }

隐藏软键盘-

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

编辑: 如果它仍然不工作,那么很可能你把它放在错误的地方。重写onfinishinflation()并在那里显示/隐藏。

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

更新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
    }

我很努力,终于找到了解决办法。每当一个新的活动开始,然后键盘不能打开,但我们可以使用Runnable在onResume,它是工作正常,所以请尝试这段代码和检查…

更新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();

编辑文本在哪里

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

ie:在你的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> 

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

这是为了使他们的键盘出现在用户名编辑文本框启动。我所做的只是在.xml文件的底部添加了一个空的Scrollview,这将使第一个编辑文本成为焦点并弹出键盘。我承认这是一个黑客,但我假设你只是想让它工作。我已经测试过了,效果很好。

<?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>

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

希望这就是你要找的。

干杯!