NumberPicker पर सॉफ्ट कीबोर्ड को अक्षम करें


168

मैं संख्यात्मक मूल्यों (सौंदर्य कारणों से) में प्रवेश करने के लिए नंबरपिकर का उपयोग करते समय नरम कीबोर्ड को निष्क्रिय करने की कोशिश कर रहा हूं। यह मेरा लेआउट-एक्सएमएल-कोड है:

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

और अंत में यह वह कोड है जहां मैं ऑनक्रिएट () - विधि में कीबोर्ड को ब्लॉक करने का प्रयास करता हूं:

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

अफसोस की बात है कि एक नंबरपर क्लिक करने पर सॉफ्ट कीबोर्ड फिर भी दिखता है। कोई विचार?

जवाबों:


475

बस यह मिला और यह एक आकर्षण की तरह काम करता है:

myNumberPicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);

आप इसे XML में भी सेट कर सकते हैं:

android:descendantFocusability="blocksDescendants" 

1
जब तक मैं कुछ याद नहीं कर रहा हूं, यह नंबरपिकर के लिए एक मूल्य में टाइप करने की क्षमता को हटा देता है। जरूरी नहीं कि यह बुरी चीज हो, इस पर निर्भर करता है कि आप पिकर का उपयोग कैसे कर रहे हैं, लेकिन यह समाधान की एक सीमा प्रतीत होती है।
frenziedherring

76
आप इसे XML: android: descendantFocusability = "blockDescendants" में भी सेट कर सकते हैं
बेन क्लेटन

1
आह, ब्लॉकडेसेंडेंट, टोकोर्स। बहुत बहुत धन्यवाद :)
लेव

अद्भुत समाधान, मुझे बचाया!
हमजाह सोबोह

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

कॉम / 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);

हां, मुझे सीधे नंबरपिकर के बच्चे के विचारों को संपादित करना था। Android API कभी-कभी बहुत विरल होता है।
बाँसएक्सएक्सएक्स

6

बस @MaxVogler के ans को बढ़ाया (इसलिए यदि यह वोट @MaxVogler को भी वोट नहीं देते हैं) और इसे एक मजबूत हैक बनाते हैं। इसके अलावा हमें कॉल करने की जरूरत नहीं है setOnFocusChangeListenerऔर setInputType। केवलsetFocusable असत्य ही करेगा।

सुविधा को सक्षम / अक्षम करने के लिए नीचे एक सहायक एपीआई है

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) नंबरपिकर वंशज को अपने सामान्य मूल्य पर ध्यान केंद्रित करने के लिए रीसेट करें, फिर झूठे वापस करें।

गलत रिटर्निंग का मतलब है कि टच अभी भी नंबरपिकर द्वारा प्रोसेस किया गया है, जिसका अर्थ है कि अगर उपयोगकर्ता एडिट बॉक्स को टैप करता है तो सॉफ्ट कीबोर्ड ऊपर आता है। यह ठीक वैसा ही होता है जैसा कि मैं उसी समस्या से सामना करना चाहता था - सॉफ्ट कीबोर्ड के डायलॉग के साथ आने पर जब यह पहली बार दिखाई देता है तो यह नाराजगी प्रकट करता है क्योंकि यह डायलॉग को दिखाई देने के बाद शिफ्ट हो जाता है।

public class GetBufferDialog extends DialogFragment implements View.OnTouchListener {

onCreateDialog()विधि में डायलॉग बनाने और नंबरपिकर खोजने के बाद:

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 की स्थापना जो कीबोर्ड को दिखाने से कुछ भी नहीं रोकता है (लॉलीपॉप)

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

एक्सएमएल:

android:descendantFocusability="blocksDescendants" 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.