2012-06-12 10 views
17

すべてに、AlertDialogのNumberPickerは、常にキーボードをアクティブにします。これを無効にするには?

単純なNumberPickerをAlertDialogで動作させようとしています。問題は、numberpickerの値を増減するたびに、キーボードがアクティブになることです。

この問題については多くの記事が掲載されていますが、いずれの提案も機能しません。

android:configChanges="keyboard|keyboardHidden" 

そして

inputManager.hideSoftInputFromWindow(currentView.getWindowToken(), 0); 

そして

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

を私はキー押下イベント(上、(dialog.show())の初期化の前と後に、これらの関数を呼び出して試してみました:私は試してみました 明らかにリスナーを使用しています)などですが、これまでのところ運がありません。

完全なコード:

popup.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" > 
    <NumberPicker 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/myNumber" 
     android:configChanges="keyboard|keyboardHidden" 
    /> 
</RelativeLayout> 

、呼び出し機能:

AlertDialog.Builder builder = new AlertDialog.Builder(this); 
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { 
    public void onClick(DialogInterface dialog, int which) { 
     return; 
    } }); 
builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { 
    public void onClick(DialogInterface dialog, int which) { 
     return; 
    } }); 
View view = getLayoutInflater().inflate(R.layout.popup, null); 
builder.setView (view); 

final AlertDialog dialog = builder.create(); 
NumberPicker picker = (NumberPicker) view.findViewById(R.id.myNumber); 
picker.setMinValue(0); 
picker.setMaxValue(999); 

dialog.getWindow(). 
    setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 
dialog.show();  

すべてのヘルプは

バリー

答えて

24

実際、上記の解決策は完全に機能しますが、より簡単な方法があります。

picker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS); 

これがすべて必要です。とにかく、返事をありがとう!!!!:-)

+0

これをXMLで設定することもできます:android:descendantFocusability = "blocksDescendants" – Borzh

1

感謝しましたandroid:configChanges属性は、レイアウトではなくManifest.xmlファイルに属します。あなたはそこからキーボードを隠している場合しかし、あなたはおそらく

android:windowSoftInputMode="stateAlwaysHidden" 

を使用しての最高ですまた、あなたのActivityだけではなくDialoggetWindow()を使用し、それが助けかどうかを確認してみてください。これはおそらく最初のもの(マニフェストから隠れている)がアクティビティ全体にキーボードを隠しておくので最も良い解決策です。

+0

こんにちはJave、あなたの答えやレイアウトXMLS対マニフェストにあなたの洞察力をありがとう。レイアウトは基本的にフォームなので、これらのパラメータをレイアウトに追加することはできません。 numberpickerはこのフォームのポップアップ(alertdialog)です。このダイアログでは、アクティビティ全体ではなく、キーボードを無効にする必要があります。これはあなたがすでにメゾオンの方法です:-)活動のgetWindowは、私がすでに試したことがあり、残念ながら助けていません – barrel

3

NumberPickerボタンにアクセスできないため、「不可能」です。

私はそれを処理するために高速汚れたハックをしました。

まず0のサイズで、この場合、ボタンには、レイアウトにフォーカス食べる人を追加します。

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" > 
    <NumberPicker 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/myNumber" 
     android:configChanges="keyboard|keyboardHidden" 
     /> 
    <Button 
     android:id="@+id/myBtn" 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     /> 
</RelativeLayout> 

は、我々はincement /デクリメントボタンをクリックのイベントをキャッチする必要がある、私はより良いものを見つけることができなかった、OnValueChangedListenerを選びました。

EditText edit = null; 
    try { 
     final Field[] fields = picker.getClass().getDeclaredFields(); 
     for (Field f : fields) { 
      if (EditText.class.equals(f.getType())) { 
       f.setAccessible(true); 
       edit = (EditText) f.get(picker); 
      } 
     } 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
    } 
    if (edit != null) { 
     final EditText finalEdit = edit; 
     final InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
     picker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() { 
      @Override 
      public void onValueChange(NumberPicker numberPicker, int i, int i1) { 
       dialog.findViewById(R.id.myBtn).requestFocusFromTouch(); 
       imm.hideSoftInputFromWindow(finalEdit.getWindowToken(), 0); 
      } 
     }); 
    } 

これは推奨されない方法です。誰かが何か良いものを見つけることを願っています。 教育目的でのみ使用してください:

+0

うわー、魅力のように動作します!ありがとうございます:-) – barrel

0

XML:

<NumberPicker 
    ... 
    android:descendantFocusability="blocksDescendants" /> 
関連する問題