ปิดใช้งานคีย์บอร์ดอ่อนใน NumberPicker


168

ฉันกำลังพยายามปิดใช้งานแป้นพิมพ์อ่อนเมื่อใช้ NumberPicker เพื่อป้อนค่าตัวเลข (เพื่อเหตุผลด้านสุนทรียภาพ) นี่คือเลย์เอาต์ของฉัน xml-code:

<?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>

และสุดท้ายนี่คือรหัสที่ฉันพยายามบล็อกแป้นพิมพ์ใน 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); 

น่าเศร้าที่คีย์บอร์ดนุ่มยังคงปรากฏขึ้นเมื่อคลิกที่ NumberPicker ความคิดใด ๆ

คำตอบ:


475

เพิ่งพบสิ่งนี้และมันใช้งานได้อย่างมีเสน่ห์:

myNumberPicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);

คุณสามารถตั้งค่านี้ใน XML:

android:descendantFocusability="blocksDescendants" 

1
ถ้าฉันไม่มีอะไรหายไปสิ่งนี้จะลบความสามารถในการพิมพ์ค่าสำหรับ NumberPicker มันไม่ได้เป็นสิ่งที่เลวร้ายขึ้นอยู่กับว่าคุณใช้เครื่องมือเลือกอย่างไร แต่ดูเหมือนจะเป็นข้อ จำกัด ของวิธีแก้ปัญหา
frenziedherring

76
คุณยังสามารถตั้งค่านี้ใน XML: android: descendantFocusability = "blocksDescendants"
Ben Clayton

1
Aaah บล็อกผู้ติดตามของหลักสูตร ขอบคุณมากครับ :)
เลฟ

ทางออกที่ยอดเยี่ยมช่วยฉัน!
Hamzeh Soboh

56

คำตอบของ Andrew Webber รุ่น Xml

android:descendantFocusability="blocksDescendants"

ตัวอย่าง

<NumberPicker
        android:id="@+id/your_numberpicker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:descendantFocusability="blocksDescendants"/>

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);

ใช่ฉันต้องแก้ไขมุมมองลูกของ NumberPicker โดยตรง บางครั้ง Android API จะเบาบางมาก
damaxxed

6

เพิ่งเพิ่ม ans ของ @MaxVogler (ดังนั้นหากไม่ต้องการลงคะแนนให้กับ @MaxVogler นี้ด้วย) และทำให้แฮ็คมีความแข็งแกร่ง นอกจากนี้เราไม่จำเป็นต้องโทรและsetOnFocusChangeListener setInputTypeเท่านั้นที่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;
        }
    }
}

4

นี่เป็นอีกวิธีในการทำซึ่งจะทำให้ผู้ใช้ยังคงสามารถแก้ไขตัวเลขได้หากต้องการ - เพียงแค่กดแป้นพิมพ์เพื่อเริ่มต้น ใช้NumberPicker.setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS)เพื่อไม่ให้คีย์บอร์ดอ่อนตัวเมื่ออินเตอร์เฟสแสดงเป็นครั้งแรกตามคำตอบข้างต้น จากนั้นรับไดอะล็อกหรือกิจกรรมของคุณเพื่อนำไปใช้View.OnTouchListenerโทรหาsetOnTouchListener(this)คุณNumberPickerและในการนำไปใช้ในการonTouch(View v,MotionEvent e)รีเซ็ตความสามารถในการสืบทอดของ numberpicker ให้เป็นค่าปกติจากนั้นส่งคืนค่าเท็จ

การส่งคืนเท็จหมายความว่าการสัมผัสยังคงดำเนินการโดย NumberPicker ซึ่งหมายความว่าหากผู้ใช้แตะที่กล่องแก้ไขคีย์บอร์ดนุ่มจะปรากฏขึ้น สิ่งนี้เกิดขึ้นกับสิ่งที่ฉันต้องการเผชิญกับปัญหาเดียวกัน - การที่คีย์บอร์ดนุ่ม ๆ ปรากฏขึ้นพร้อมกับการโต้ตอบเมื่อมันแสดงให้เห็นครั้งแรกไม่พอใจเมื่อมันเปลี่ยนการสนทนาขึ้นหลังจากที่มันปรากฏขึ้น

public class GetBufferDialog extends DialogFragment implements View.OnTouchListener {

หลังจากสร้าง Dialog ในonCreateDialog()เมธอดและค้นหา NumberPicker:

m_oldFocus = m_numberpicker.getDescendantFocusability();
m_numberpicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS); 
m_numberpicker.setOnTouchListener(this);

และนี่คือวิธี OnTouch:

public boolean onTouch(View v, MotionEvent event) {
    m_numberpicker.setDescendantFocusability(m_oldFocus);
    return false;
}

1
มีเพียงคนนี้เท่านั้นที่ช่วยฉันแก้ปัญหาของฉันขอบคุณสำหรับแนวทางของคุณ
smoothumut

2

สิ่งที่ฉันพบได้ง่ายที่สุดในการทำงานคือ:

numberPicker               = (NumberPicker) myDialogView.findViewById(R.id.myViewId);
EditText numberPickerChild = (EditText) numberPicker.getChildAt(0);
numberPickerChild.setFocusable(false);
numberPickerChild.setInputType(InputType.TYPE_NULL);

2

หากคุณต้องการซ่อนแป้นพิมพ์ซอฟต์แวร์เมื่อโหลดมุมมองด้วยตัวเลือกหมายเลขของคุณ แต่ยังต้องการให้ผู้ใช้สามารถแก้ไขได้หลังจากที่โหลดมุมมองแล้วคุณไม่ควรปิดกั้นความสามารถในการปรับโฟกัสของลูกหลาน แต่เพียงป้องกันตัวเลือกหมายเลขจากการเป็นรายการที่เน้นแรกในมุมมองของคุณ

ดูคำตอบนี้สำหรับรายละเอียด

ตามคำตอบข้างต้น:

    <!-- Dummy item to prevent Number Picker from receiving focus -->
    <LinearLayout        
        android:focusable="true" 
        android:focusableInTouchMode="true"
        android:layout_width="0px" 
        android:layout_height="0px"/>

    <!-- :nextFocusUp and :nextFocusLeft have been set to the id of this component 
         to prevent the dummy from receiving focus again -->
    <NumberPicker 
        android:id="@+id/number_picker"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:nextFocusUp="@id/number_picker" 
        android:nextFocusLeft="@id/number_picker"/>

1

ฉันไม่รู้ว่าทำไมมันถึงทำงานได้ แต่การตั้งค่า OnClickListener ซึ่งไม่ทำอะไรเลยที่ทำให้แป้นพิมพ์ไม่แสดง (Lollipop)

numberPicker.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View view) {
  }
});

0
/**
 * set focus to top level window
 * disposes descendant focus
 * disposes softInput
 * @param context - activity context
 * @param enable - state of focus
 * */
public static void topLevelFocus(Context context, boolean enable){
    if(Activity.class.isAssignableFrom(context.getClass())){
        ViewGroup tlView = (ViewGroup) ((Activity) context).getWindow().getDecorView();
        if(tlView!=null){
            tlView.setFocusable(enable);
            tlView.setFocusableInTouchMode(enable);
            tlView.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
            tlView.requestFocus();
        }
    }
}

* เรียกสิ่งนี้:

  • จะไม่ปิดกั้นการปรับโฟกัสที่สืบทอด (numberpicker จะแก้ไขได้)

  • จะซ่อนอินพุตที่อ่อนในการสร้าง

  • ก่อน (การประมวลผลอินพุต) getValue () จะอนุญาตให้รับ walue ที่เหมาะสม



0

รหัสการทำงานโดยทาง โปรแกรม:

mp.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);

XML:

android:descendantFocusability="blocksDescendants" 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.