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

发布于 2021-02-02 22:50:14

首先,我已经看到了该线程。我尝试了那里给出的可接受的方法。

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

  • 第一个有2个EditText,一个是用户名,另一个是密码
  • 第二个有一个ListView和一个EditText-过滤listView

在我的第一个屏幕中,我希望用户名EditText专注于启动,并且Keyboard应该可见。这是我的实现(通过删除不必要的/不相关的代码进行简化)。

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时显示
    我的问题是我在两种情况下都截然相反 …希望有人以前遇到过这个问题。顺便说一句,我正在模拟器和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提供的只有一个答案对我有用。解决方案是将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的答案。

关注者
0
被浏览
253
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    将其添加到你的代码android:focusableInTouchMode="true"中将确保你的键盘在启动时不会出现在你的edittext框中。你想将此行添加到包含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文件的底部添加了一个空的Scrollview,这将第一个edittext置于焦点并弹出了键盘。我承认这是一个hack,但是我假设你只是想这样做。我已经对其进行了测试,并且效果很好。

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

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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看