禁用NumberPicker上的软键盘

dam*_*xed 165 android android-widget android-layout android-softkeyboard android-edittext

我正在尝试在使用NumberPicker输入数值时停用软键盘(出于美观原因).这是我的layout-xml代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:id="@+id/linearLayout2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginBottom="30dp"
        android:layout_marginTop="30dp" >

        <NumberPicker
            android:id="@+id/repetitionPicker"
            android:layout_width="40dp"
            android:layout_height="wrap_content" />

        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:text="@string/repetitions_short_divider"
            android:textAppearance="?android:attr/textAppearanceMedium" />

        <NumberPicker
            android:id="@+id/weightPicker"
            android:layout_width="40dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="40dp" />

        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:text="@string/pounds"
            android:textAppearance="?android:attr/textAppearanceMedium" />
    </LinearLayout>


    <Button
        android:id="@+id/saveButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="@string/save" />

</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

最后这是我尝试在onCreate() - 方法中阻止键盘的代码:

// hide keyboard
View.OnClickListener disableKeyBoardListener = new View.OnClickListener() {
    public void onClick(View v) {
        ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE))
                .hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }
};

((EditText) weightPicker.getChildAt(1)).setInputType(InputType.TYPE_NULL);
((EditText) repetitionPicker.getChildAt(1)).setInputType(InputType.TYPE_NULL);

((EditText) weightPicker.getChildAt(1)).setOnClickListener(disableKeyBoardListener);
//((EditText) repetitionPicker.getChildAt(1)).setOnClickListener(disableKeyBoardListener);
//weightPicker.setOnClickListener(disableKeyBoardListener);
//repetitionPicker.setOnClickListener(disableKeyBoardListener);     

getWindow().setSoftInputMode(
        WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 
Run Code Online (Sandbox Code Playgroud)

遗憾的是,单击NumberPicker时,软键盘仍会显示.有任何想法吗?

小智 463

刚发现这个,它就像一个魅力:

myNumberPicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);

您也可以在XML中设置它:

android:descendantFocusability="blocksDescendants" 
Run Code Online (Sandbox Code Playgroud)

  • 您也可以在XML中设置它:android:descendantFocusability ="blocksDescendants" (76认同)

G_V*_*G_V 54

Xml版本的Andrew Webber的回答

android:descendantFocusability="blocksDescendants"
Run Code Online (Sandbox Code Playgroud)

<NumberPicker
        android:id="@+id/your_numberpicker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:descendantFocusability="blocksDescendants"/>
Run Code Online (Sandbox Code Playgroud)


dam*_*xed 7

通过com/android/internal/widget/NumberPicker.java源代码阅读后,我得到了以下解决方案:

// Hide soft keyboard on NumberPickers by overwriting the OnFocusChangeListener
OnFocusChangeListener fcl = new OnFocusChangeListener() {
    public void onFocusChange(View v, boolean hasFocus) {
        // Do nothing to suppress keyboard
    }
};

((EditText) numberPicker.getChildAt(1)).setOnFocusChangeListener(fcl);

// Suppress soft keyboard from the beginning
((EditText) numberPicker.getChildAt(1)).setInputType(InputType.TYPE_NULL);
Run Code Online (Sandbox Code Playgroud)


hav*_*exz 6

刚刚增强了@MaxVogler的ans(所以如果也投票给@MaxVogler这个投票)并使它成为一个强大的黑客.我们也不需要打电话setOnFocusChangeListenersetInputType.只会setFocusable做假.

以下是启用/禁用该功能的帮助程序api

public static void enableNumberPickerManualEditing(NumberPicker numPicker,
        boolean enable) {
    int childCount = numPicker.getChildCount();

    for (int i = 0; i < childCount; i++) {
        View childView = numPicker.getChildAt(i);

        if (childView instanceof EditText) {
            EditText et = (EditText) childView;
            et.setFocusable(enable);
            return;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Vin*_*yak 5

以编程方式工作代码

mp.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);
Run Code Online (Sandbox Code Playgroud)

XML:

android:descendantFocusability="blocksDescendants" 
Run Code Online (Sandbox Code Playgroud)