Tắt bàn phím mềm trên NumberPicker


168

Tôi đang cố gắng hủy kích hoạt bàn phím mềm khi sử dụng NumberPicker để nhập các giá trị số (vì lý do thẩm mỹ). Đây là layout-xml-code của tôi:

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

Và cuối cùng, đây là mã nơi tôi cố gắng chặn bàn phím trong phương thức 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); 

Đáng buồn thay, bàn phím mềm vẫn hiển thị khi nhấp vào NumberPicker. Có ý kiến ​​gì không?

Câu trả lời:


475

Chỉ cần tìm thấy điều này và nó hoạt động như một nét duyên dáng:

myNumberPicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);

Bạn cũng có thể đặt cái này trong XML:

android:descendantFocusability="blocksDescendants" 

1
Trừ khi tôi thiếu một cái gì đó, điều này sẽ loại bỏ khả năng nhập giá trị cho NumberPicker. Đây không hẳn là một điều xấu, tùy thuộc vào cách bạn đang sử dụng công cụ chọn, nhưng dường như đó là một hạn chế của giải pháp.
điên cuồng

76
Bạn cũng có thể thiết lập điều này trong XML: android: descendantF Focusability = "blocksDescendants"
Ben Clayton

1
Aaah, khối Hậu duệ, dĩ nhiên. Cảm ơn bạn rất nhiều :)
Lev

Giải pháp tuyệt vời, đã cứu tôi!
Hamzeh Soboh

56

Phiên bản Xml của câu trả lời của Andrew Webber

android:descendantFocusability="blocksDescendants"

Thí dụ

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

7

Sau khi đọc qua mã nguồn com / android / Internal / widget / NumberPicker.java, tôi đã nhận được giải pháp sau:

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

Có, tôi đã phải chỉnh sửa trực tiếp các chế độ xem con của NumberPicker. API Android đôi khi rất thưa thớt.
damaxxed

6

Chỉ cần nâng cao ans của @MaxVogler (vì vậy nếu wannt bỏ phiếu này, phiếu bầu @MaxVogler cũng vậy) và biến nó thành một bản hack mạnh mẽ. Ngoài ra chúng tôi không cần phải gọi setOnFocusChangeListenersetInputType. Chỉ setFocusableđể sai sẽ làm.

Dưới đây là một api trợ giúp để bật / tắt tính năng

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

Đây là một cách khác để làm điều đó cho phép người dùng vẫn chỉnh sửa một số nếu họ muốn - nó chỉ cần tắt bàn phím mềm ban đầu. Sử dụng NumberPicker.setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS)để tắt bàn phím mềm khi giao diện hiển thị lần đầu tiên theo câu trả lời ở trên. Sau đó, lấy hộp thoại hoặc hoạt động của bạn để thực hiện View.OnTouchListener, gọi setOnTouchListener(this)cho bạn NumberPickervà trong quá trình thực hiện onTouch(View v,MotionEvent e)đặt lại khả năng lấy nét con cháu của con số về giá trị bình thường, sau đó trả về false.

Trả về sai có nghĩa là cảm ứng vẫn được NumberPicker xử lý, điều đó có nghĩa là nếu người dùng nhấn vào hộp chỉnh sửa, bàn phím mềm sẽ xuất hiện. Điều này xảy ra chính xác là những gì tôi muốn đối mặt với cùng một vấn đề - có bàn phím mềm xuất hiện với hộp thoại khi nó hiển thị lần đầu tiên là khó chịu khi nó chuyển hộp thoại lên sau khi nó xuất hiện.

public class GetBufferDialog extends DialogFragment implements View.OnTouchListener {

sau khi tạo Hộp thoại trong onCreateDialog()phương thức và tìm NumberPicker:

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

và đây là phương pháp OnTouch:

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

1
chỉ có điều này mới giúp tôi giải quyết vấn đề của mình, cảm ơn vì cách tiếp cận của bạn
smoothumut

2

Đơn giản nhất tôi tìm thấy để làm việc là:

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

2

Nếu bạn chỉ muốn ẩn bàn phím phần mềm khi tải chế độ xem bằng bộ chọn số, nhưng vẫn muốn người dùng có thể chỉnh sửa sau khi tải chế độ xem, thì bạn không nên chặn khả năng lấy nét của hậu duệ. Thay vào đó, chỉ cần ngăn bộ chọn số là mục được tập trung đầu tiên trong chế độ xem của bạn.

Xem câu trả lời này để biết chi tiết.

Dựa trên câu trả lời trên:

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

Tôi không biết tại sao nó hoạt động, nhưng cài đặt OnClickListener không ngăn bàn phím hiển thị (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();
        }
    }
}

* gọi đây:

  • sẽ không chặn khả năng tập trung của hậu duệ (trình đánh số sẽ có thể chỉnh sửa)

  • sẽ ẩn đầu vào mềm khi tạo

  • trước khi (xử lý đầu vào) getValue () sẽ cho phép nhận được giá trị phù hợp



0

Mã làm việc theo chương trình:

mp.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);

XML:

android:descendantFocusability="blocksDescendants" 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.