Вимкнути м'яку клавіатуру на NumberPicker


168

Я намагаюся відключити м'яку клавіатуру під час використання 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); 

На жаль, м'яка клавіатура все ще з’являється при натисканні на номер типу "Picker". Будь-які ідеї?

Відповіді:


475

Щойно знайшли це, і це працює як принадність:

myNumberPicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);

Ви також можете встановити це в XML:

android:descendantFocusability="blocksDescendants" 

1
Якщо я щось не пропускаю, це знімає можливість вводити значення для NumberPicker. Це не обов'язково погано, залежно від того, як ви користуєтеся засобом вибору, але це, мабуть, є обмеженням рішення.
frenziedherring

76
Ви також можете встановити це в XML: android: descendantFocusability = "блокиDescendants"
Бен Клейтон

1
Ааа, блокує нащадків, звичайно. Дуже дякую :)
Лев

Дивовижне рішення, врятувало мене!
Hamzeh Soboh

56

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

Просто покращили анкети @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, а це означає, що якщо користувач натискає поле редагування, з’являється м'яка клавіатура. Це трапляється саме з тим, що я хотів зіткнутися з тією ж проблемою - те, що м'яка клавіатура придумує діалогове вікно, коли воно вперше показано, викликає захоплення, оскільки воно зміщує діалогове вікно після появи.

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

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

* викликає це:

  • не блокуватиме фокусируемость нащадків (вибір номера редагуватиметься)

  • приховає м'який вхід при створенні

  • до (обробка вводу) getValue () дозволить отримати належну оцінку



0

Робочий код Програматично:

mp.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);

XML:

android:descendantFocusability="blocksDescendants" 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.