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

可能重复:
关闭/隐藏Android软键盘

首先我已经看到这个线程。 我尝试了在那里接受的方法..但没有为我工作..

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

  • 首先有两个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);
       }
    }
    

    为了简化

  • 在登录页面(第一页)我希望我的键盘在启动时可见。
  • 在第二页上,我希望键盘先被隐藏,只有当用户触摸editText时才会出现
  • 而我的问题是,我得到了两次恰恰相反 ...希望有人面临这个问题之前..BTW我在模拟器和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);
    

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

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

    只有一个答案适用于我,由@Dyarish提供。 解决方案是在xml中使用focusableInTouchMode设置来显示包含editText的布局。 这个伎俩

    <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的线性布局中。 你应该可以玩这个来解决你的问题。 我已经测试过了。 解决方案简单

    即:在你的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文件的底部添加了一个空的滚动视图,这将第一个编辑文本放在焦点上并弹出键盘。 我承认这是一个黑客攻击,但我认为你只是想让这个工作。 我测试过了,它工作正常。

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

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

    希望这是你正在寻找的。

    干杯!


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


    试试这个代码。

    为显示Softkeyboard:

    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);
        }
    
    链接地址: http://www.djcxy.com/p/2721.html

    上一篇: Programmatically Hide/Show Android Soft Keyboard

    下一篇: Difference between gravity and layout