17

すべての人に、

シンプルな 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();      

どんな助けでも大歓迎

バリー

4

4 に答える 4

25

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

picker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);

必要なのはこれだけです。とにかく、返信ありがとうございます!!!! :-)

于 2012-06-12T17:56:16.983 に答える
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>

インクリメント/デクリメント ボタンをクリックしたイベントをキャッチする必要があります。私は 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);
            }
        });
    }

これは推奨される解決策ではありません。誰かがもっと良いものを見つけてくれることを願っています。教育目的でのみ使用してください ;-)

于 2012-06-12T14:50:13.313 に答える
1

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

android:windowSoftInputMode="stateAlwaysHidden"

また、だけでなくgetWindow()自分で使用してみて、それが役立つかどうかを確認する必要があります。これはおそらく最良の解決策です。最初の解決策(マニフェストから非表示)は、アクティビティ全体を通してキーボードを非表示に保つからです。ActivityDialog

于 2012-06-12T13:00:16.197 に答える
0

XML:

<NumberPicker
    ...
    android:descendantFocusability="blocksDescendants" />
于 2015-08-07T14:42:19.010 に答える