安卓 - 以编程方式隐藏/显示软键盘

2022-08-31 05:33:24

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

首先,我已经看到了这个线程。我尝试了那里给出的公认方法,但没有任何东西对我有用。

我的应用中有两个屏幕。

  • 第一个有2个编辑文本 - 一个用于用户名,一个用于密码
  • 第二个有一个列表视图和一个编辑文本 - 用于过滤列表视图

在我的第一个屏幕中,我希望用户名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. 在第二页上,我希望首先隐藏键盘,仅在用户触摸 editText 时才显示

我的问题是,我在这两种情况下都得到了完全相反的结果。希望有人以前遇到过这个问题。顺便说一句,我正在模拟器和HTC Desire手机上进行测试。

#FINAL成果

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

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 中的可聚焦InTouchMode 设置用于包含 EditTexts 的布局。这就奏效了

<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的答案。所以我把赏金颁发给他。感谢我所有其他试图帮助我的朋友。


答案 1

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

我非常努力地尝试并找到了解决方案...每当一个新的活动开始,键盘无法打开,但我们可以在onResue中使用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);

将焦点放在编辑文本上

 ed.requestFocus();

其中 ed 是 EditText


答案 2

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

即:在您的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>

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

希望这就是你正在寻找的。

干杯!


推荐