以编程方式隐藏/显示Android软键盘

时间:2011-08-26 05:16:44

标签: java android hide show soft-keyboard

  

可能重复:
  Close/hide the Android Soft Keyboard

首先,我已经看到了this线程。我试过那里接受的方法。但是没有什么对我有用..

我的应用中有两个屏幕。

  • 第一个有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);
   }
}

简化

  1. 在登录页面(第一页)我希望我的键盘可见 启动..
  2. 在SecondPage上我希望首先隐藏键盘,只显示 当用户触摸editText时
  3. 我的问题是我两次都完全相反 ...希望有人在遇到此问题之前......我正在模拟器和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提供,事实上他与另一个SO线程相关联,这是我以前没见过的。但 有趣的是,这个解决方案是在我开始时引用的线程中给出的。而我还没试过 这是因为它在所有其他帖子都有很多票的线程中没有票数。愚蠢的高度..

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

    对我来说,第二个解决方案看起来很整洁,所以我决定坚持下去。但是第一个肯定有效。 另外@Dyarish的答案包含一个聪明的黑客,使用EditText下面的ScrollView给EditText作为焦点..但我没有尝试过,但它应该工作。虽然不整洁..

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

    只有一个答案适合我,由@Dyarish提供。而解决方案是使用 包含editText的布局的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的答案。所以我正在向他致敬。谢谢所有其他朋友 谁试图帮助我..

4 个答案:

答案 0 :(得分:157)

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

我非常努力地找到了一个解决方案...每当新的活动开始时键盘都无法打开,但我们可以在 onResume 中使用 Runnable 并且它工作正常所以请尝试这个代码并检查......

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

其中ed是EditText

答案 1 :(得分:130)

将此代码添加到代码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> 

------------------ 编辑:在启动时显示键盘 -------------- ---------

这是为了让他们在启动时键盘出现在用户名edittextbox上。我所做的就是在.xml文件的底部添加一个空的Scrollview,这会将第一个edittext置于焦点并弹出键盘。我承认这是一个黑客,但我假设你只是希望这个工作。我测试了它,它工作正常。

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

如果您正在寻找更有说服力的解决方案,我发现了this可能对您有所帮助的问题,它不像上面的解决方案那么简单,但可能是更好的解决方案。我没有测试它,但它显然有效。我认为它类似于你尝试过的解决方案,虽然不适合你。

希望这就是你要找的东西。

干杯!

答案 2 :(得分:53)

试试这段代码。

显示软键盘:

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

隐藏SoftKeyboard -

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

答案 3 :(得分:8)

您是否在第一个窗口中尝试InputMethodManager.SHOW_IMPLICIT

并隐藏在第二个窗口中使用InputMethodManager.HIDE_IMPLICIT_ONLY

编辑:

如果它还没有工作那么可能你把它放在了错误的地方。覆盖onFinishInflate()并在那里显示/隐藏。

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