NumberPicker'da yazılım klavyesini devre dışı bırak


168

Sayısal değerler (estetik nedenlerle) girmek için bir NumberPicker kullanırken yumuşak klavyeyi devre dışı bırakmaya çalışıyorum. Bu benim layout-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>

Ve son olarak bu, onCreate () - yönteminde klavyeyi engellemeye çalıştığım kod:

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

Ne yazık ki, bir NumberPicker'a tıklandığında yazılım klavyesi görünmeye devam ediyor. Herhangi bir fikir?

Yanıtlar:


475

Sadece bunu buldum ve bir cazibe gibi çalışıyor:

myNumberPicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);

Bunu XML olarak da ayarlayabilirsiniz:

android:descendantFocusability="blocksDescendants" 

1
Ben bir şey eksik sürece, bu NumberPicker için bir değer yazma yeteneğini kaldırır. Seçiciyi nasıl kullandığınıza bağlı olarak mutlaka kötü bir şey değildir, ancak çözümün bir sınırlaması gibi görünmektedir.
frenziedherring

76
Bunu XML olarak da ayarlayabilirsiniz: android: descendantFocusability = "blocksDescendants"
Ben Clayton

1
Aaah, bloklar, torunları, tabii. Çok teşekkür ederim :)
Lev

İnanılmaz bir çözüm, kurtardı beni!
Hamzeh Soboh

56

Andrew Webber'in cevabının XML sürümü

android:descendantFocusability="blocksDescendants"

Misal

<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 kaynak kodunu okuduktan sonra aşağıdaki çözüme ulaştım:

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

Evet, NumberPicker öğesinin alt görünümlerini doğrudan düzenlemek zorunda kaldım. Android API bazen çok seyrek.
2012'de

6

@MaxVogler'ın ans'ını geliştirdim (eğer bu oyu @MaxVogler'da oylamıyorsanız) ve sağlam bir hack yapın. Ayrıca aramamıza gerek yok setOnFocusChangeListenerve setInputType. Sadece setFocusableyanlış yapacaktır.

Aşağıda, özelliği etkinleştirmek / devre dışı bırakmak için bir yardımcı API bulunmaktadır

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

İşte bunu yapmanın başka bir yolu, kullanıcının isterse hala bir numarayı düzenlemesini sağlar - başlangıçta yumuşak klavyeyi bastırır. NumberPicker.setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS)Arayüz yukarıdaki cevaplara göre ilk gösterildiğinde yazılım klavyesini bastırmak için kullanın . Sonra uygulamak için iletişim veya aktivitesini olsun View.OnTouchListener, çağrıyı setOnTouchListener(this)sizinle ilgili şu NumberPickerve sizin uygulanmasında onTouch(View v,MotionEvent e)normal değerine numberpicker soyundan focusability sıfırlamak ardından return false.

Yanlış döndürme, dokunmanın hala NumberPicker tarafından işlendiği anlamına gelir; bu, kullanıcı düzenleme kutusuna dokunduğunda yumuşak klavyenin geldiği anlamına gelir. Bu tam olarak aynı sorunla karşı karşıya olduğum şeydi - ilk göründüğünde yumuşak klavyenin iletişim kutusuyla gelmesi, iletişim kutusunun göründükten sonra yukarı kaydırdığı için hoşnut değil.

public class GetBufferDialog extends DialogFragment implements View.OnTouchListener {

onCreateDialog()yöntemde İletişim Kutusu oluşturduktan ve NumberPicker öğesini bulduktan sonra:

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

ve işte OnTouch yöntemi:

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

1
sadece bu benim sorunumu
çözmeme

2

Çalışmak için bulduğum en basit şey:

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

2

Görünümü yalnızca sayı seçicinizle yüklerken yazılım klavyesini gizlemek istiyorsanız, ancak yine de kullanıcıların görünüm yüklendikten sonra düzenleme yapabilmelerini istiyorsanız, o zaman azalan odaklanabilirliği engellememelisiniz. Bunun yerine, sayı seçicinin görünümünüzdeki ilk odaklanmış öğe olmasını önleyin.

Ayrıntılar için bu cevaba bakınız.

Yukarıdaki cevaba dayanarak:

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

Neden çalıştığını bilmiyorum, ama hiçbir şey yapmayan OnClickListener'ı ayarlamak klavyenin gösterilmesini engelledi (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();
        }
    }
}

* bunu çağırıyor:

  • soyundan odaklanabilirliği engellemez (numara seçici düzenlenebilir)

  • oluşturma sırasında yumuşak girişi gizleyecek

  • önce (girdi işleniyor) getValue () düzgün walue almaya izin verecek



0

Programlı çalışma kodu :

mp.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);

XML:

android:descendantFocusability="blocksDescendants" 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.