Nonaktifkan keyboard lunak pada NumberPicker

168

Saya mencoba untuk menonaktifkan keyboard lunak saat menggunakan NumberPicker untuk memasukkan nilai numerik (untuk alasan estetika). Ini adalah layout-xml-code saya:

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

Dan akhirnya ini adalah kode tempat saya mencoba memblokir keyboard di metode 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); 

Sayangnya, keyboard lunak masih muncul ketika mengklik pada NumberPicker. Ada ide?

damaxxed
sumber

Jawaban:

475

Baru saja menemukan ini dan berfungsi seperti pesona:

myNumberPicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);

Anda juga dapat mengatur ini dalam XML:

android:descendantFocusability="blocksDescendants" 
Andrew Webber
sumber
1
Kecuali saya kehilangan sesuatu, ini menghilangkan kemampuan untuk mengetikkan nilai untuk NumberPicker. Ini tidak selalu merupakan hal yang buruk, tergantung pada bagaimana Anda menggunakan pemetik, tetapi itu tampaknya menjadi batasan dari solusi.
frenziedherring
76
Anda juga dapat mengatur ini dalam XML: android: descendantFocusability = "blocksDescendants"
Ben Clayton
1
Aaah, blok keturunan, tentu saja. Terima kasih banyak :)
Im
Solusi luar biasa, selamatkan saya!
Hamzeh Soboh
56

Versi xml dari jawaban Andrew Webber

android:descendantFocusability="blocksDescendants"

Contoh

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

Setelah membaca kode sumber com / android / internal / widget / NumberPicker.java saya mendapatkan solusi berikut:

// 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);
damaxxed
sumber
Ya, saya harus mengedit langsung pandangan anak tentang NumberPicker. API Android terkadang sangat jarang.
Damaxxed
6

Hanya meningkatkan ans @MaxVogler (jadi jika Anda tidak dapat memilih ini @MaxVogler juga) dan menjadikannya hack yang kuat. Kami juga tidak perlu menelepon setOnFocusChangeListenerdan setInputType. Hanya setFocusablemelakukan yang salah yang akan dilakukan.

Di bawah ini adalah helper api untuk mengaktifkan / menonaktifkan fitur

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;
        }
    }
}
havexz
sumber
4

Berikut cara lain untuk melakukannya yang memungkinkan pengguna masih mengedit nomor jika mereka mau - itu hanya menekan keyboard lunak pada awalnya. Gunakan NumberPicker.setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS)untuk menekan keyboard lunak ketika antarmuka pertama kali ditampilkan sesuai jawaban di atas. Kemudian dapatkan dialog atau aktivitas Anda untuk mengimplementasikan View.OnTouchListener, panggil setOnTouchListener(this)Anda NumberPicker, dan dalam implementasi Anda onTouch(View v,MotionEvent e)atur ulang fokus penurun angka ke nilai normal, lalu kembalikan salah.

Mengembalikan false berarti bahwa sentuhan masih diproses oleh NumberPicker, yang berarti bahwa jika pengguna mengetuk kotak edit, keyboard lunak muncul. Ini kebetulan persis apa yang saya inginkan dihadapkan dengan masalah yang sama - memiliki keyboard lunak muncul dengan dialog ketika pertama kali menunjukkan tidak menyenangkan karena menggeser dialog ke atas setelah muncul.

public class GetBufferDialog extends DialogFragment implements View.OnTouchListener {

setelah membuat Dialog dalam onCreateDialog()metode dan menemukan NumberPicker:

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

dan inilah metode OnTouch:

public boolean onTouch(View v, MotionEvent event) {
    m_numberpicker.setDescendantFocusability(m_oldFocus);
    return false;
}
Dave Haines
sumber
1
hanya yang ini membantu saya untuk menyelesaikan masalah saya, terima kasih atas pendekatan Anda
smoothumut
2

Yang paling sederhana yang saya temukan untuk bekerja adalah:

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

Jika Anda hanya ingin menyembunyikan keyboard perangkat lunak saat memuat tampilan dengan pemilih nomor Anda, tetapi tetap ingin pengguna dapat mengedit setelah tampilan dimuat, maka Anda tidak boleh memblokir fokus yang menurun. Alih-alih, cukup cegah pemilih nomor menjadi item fokus pertama dalam tampilan Anda.

Lihat jawaban ini untuk detailnya.

Berdasarkan jawaban di atas:

    <!-- 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"/>
eckc
sumber
1

Saya tidak tahu mengapa itu bekerja, tetapi pengaturan OnClickListener yang tidak melakukan apa pun mencegah keyboard ditampilkan (Lollipop)

numberPicker.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View view) {
  }
});
user4215456
sumber
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();
        }
    }
}

* menyebut ini:

  • tidak akan memblokir fokus turunan (numberpicker akan dapat diedit)

  • akan menyembunyikan input lunak saat membuat

  • sebelum (memproses input) getValue () akan memungkinkan untuk mendapatkan nilai yang tepat


ceph3us
sumber
0

Kode kerja secara terprogram:

mp.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);

XML:

android:descendantFocusability="blocksDescendants" 
Vinayak
sumber