1. ホーム

[解決済み】Android - プログラムでソフトキーボードを隠す/表示する【重複あり

2022-04-06 08:50:25

質問

<ブロッククオート

重複の可能性があります。

Androidのソフトキーボードをプログラムで閉じる/隠すにはどうすればよいですか?

まず最初に、私はすでに見た これ というスレッドがあります。私はそこに与えられた受け入れ方法を試してみましたが、何も私のために動作しませんでした。

私のアプリには2つの画面があります。

  • 1つ目のテキストは、ユーザー名とパスワードの2つのEditTextです。
  • 2つ目は、1つのListViewと1つの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()
}

まあね。 起動時にキーボードが表示されない . そして、私のデザインは、そこにキーボードを必要とします。

では、次に 2ページ目 . すでに述べたように、そこには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 Phoneでテストしています。

#最終結果

まあ、ここにいる友人たちの助けもあって、なんとか動くようになったんだけどね。

1. 起動時にキーボードを表示する

2つの回答でうまくいきました。 一つは @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);

2つ目の回答は@Dyarishさんによるものです。実は、彼は別のSOFスレッドにリンクしており、私はそのスレッドを見たことがありません。しかし、おかしなことに、この解決策は、私が最初に参照したスレッドで与えられているのです。そして、私は試していません。 というのも、他の投稿がたくさん票を集めているスレッドで、その投稿は0票だったからです。愚の骨頂。

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

私としては、2番目のソリューションがきれいに見えたので、それにこだわることにしました。 また、@Dyarishの回答には、EditTextの下にあるScrollViewを使用してEditTextにフォーカスを与えるという巧妙なハックが含まれています。しかし、私は試していませんが、それは動作するはずです。でも、うまくはいかない。

2. アクティビティ開始時にキーボードを隠すには

私の場合、@Dyarish さんの提供する1つの回答のみが有効でした。そして、その解決策は EditTextsを含むレイアウトの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を含むリニアレイアウトに追加したい。これで、両方の問題を解決することができるはずです。 私はこれをテストしました。簡単な解決策です。

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> 

------------------ EDIT: 起動時にキーボードを表示させるには -----------------------

これは、起動時にユーザー名のエディットボックスにキーボードを表示させるためのものです。私がしたことは、空の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>

もっと雄弁な解決策をお探しなら、私は これ という質問がありますが、これは上記の解決策ほど簡単ではありませんが、おそらくより良い解決策でしょう。私はテストしていませんが、どうやらうまくいきそうです。あなたが試した解決策に似ていると思いますが、うまくいきませんでしたね。

これがあなたが探しているものであることを願っています。

乾杯