程式隐藏/显示Android软键盘

问题:

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

首先我已经看到this线程了。我尝试了接受的方法给了那里。但没有什么对我有用
我的应用程序中有两个屏幕

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

为了简化

  1. 登录页面(第一页)我希望我的键盘可以看到
    启动..
  2. 在第二页我希望键盘首先被隐藏,只出现
    当用户触摸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);

对我来说,第二个解决方案看起来很整洁,所以我决定坚持下去。但是第一个解决方案肯定是有效的。
另外@ Dyarish的答案包含一个聪明的黑客,使用一个ScrollView下面的EditText给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的答案。所以我给他的赏金给他。谢谢所有其他的朋友
谁试图帮助我..

回答:

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

—————— 编辑:使键盘出现在启动时 ———————–
这是为了使Keyboard在启动时显示在用户名edittextbox上。我所做的一切都是将空的Scrollview添加到.xml文件的底部,这将把第一个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问题可能有助于您,它不像上面的解决方案那么简单,但可能是一个更好的解决方案。我没有测试,但它显然是有效的。我认为这与您尝试过的解决方案类似,但对您而言并不奏效。
希望这是你正在寻找的。
干杯!

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Programatically Hide/Show Android Soft Keyboard

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

− 1 = 9