Отключить клавиатуру на NumberPicker


Я пытаюсь отключить экранную клавиатуру при использовании NumberPicker для ввода числовых значений (по эстетическим соображениям). Это мой макет-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>

и, наконец, это код, где я пытаюсь заблокировать клавиатуру в 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. Есть идеи?

9 143

9 ответов:

только что нашел это, и это работает как шарм:

myNumberPicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);

вы также можете установить это в XML:

android:descendantFocusability="blocksDescendants" 

Xml-версия ответа Эндрю Уэббера

android:descendantFocusability="blocksDescendants"

пример

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

после чтения через com / android / внутренний / виджет / 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);

просто улучшил @ MaxVogler 's ans (так что если wannt голосовать этот голос @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;
        }
    }
}

вот еще один способ сделать это, который позволяет пользователю по - прежнему редактировать номер, если они хотят-он просто подавляет программную клавиатуру изначально. Используйте NumberPicker.setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS) чтобы подавить мягкую клавиатуру, когда интерфейс впервые отображается в соответствии с ответами выше. Затем получите свой диалог или действие для реализации View.OnTouchListener, называют setOnTouchListener(this) на NumberPicker, а в вашей реализации onTouch(View v,MotionEvent e) сбросьте фокусируемость потомка numberpicker до его нормального значения, а затем вернитесь ложный.

возврат false означает, что касание все еще обрабатывается NumberPicker, что означает, что если пользователь нажимает на поле редактирования, появляется мягкая клавиатура. Это происходит именно то, что я хотел столкнуться с той же проблемой - когда мягкая клавиатура придумывает диалог, когда он впервые показывает, это неприятно, поскольку он сдвигает диалог вверх после его появления.

public class GetBufferDialog extends DialogFragment implements View.OnTouchListener {

после создания диалогового окна в 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;
}

самое простое, что я нашел для работы было:

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

Я не знаю, почему это работает, но установка OnClickListener, который ничего не делает, не мешает клавиатуре показывать (леденец)

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

Если вы хотите только скрыть программную клавиатуру при загрузке представления с помощью средства выбора номера, но все же хотите, чтобы пользователи могли редактировать после загрузки представления, то вы не должны блокировать фокусировку потомков. Вместо этого просто не допускайте, чтобы выбор номера был первым сфокусированным элементом в вашем представлении.

посмотреть ответ для сведения.

основываясь на приведенном выше ответе:

    <!-- 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"/>
/**
 * 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 будет доступен для редактирования)

  • скроет мягкий ввод на create

  • before (processing input) getValue () позволит получить правильный walue