2012-10-23 23 views
14

मेरे पास एक एप्लिकेशन है, और पर सॉफ्टकीबोर्ड को पर बड़ी संख्या में बंद करने की आवश्यकता है। उदाहरण के लिए, जब एक बटन, पर क्लिक जब एक नया लेआउट तैयार की है स्क्रीन अभिविन्यास परिवर्तन, पर, जब नियंत्रक बताता यूआई के लिए, वगैरह। मैं व्यूफ्लिपर के साथ दृश्य को फ़्लिप करने के लिएमेनू बटन को विकल्प का उपयोग करता हूं, और स्पष्ट रूप से मैं चाहता हूं कि कीबोर्ड फ़्लिप किए गए दृश्य में छिप जाए (वहां कोई इनपुट फ़ील्ड नहीं है)।विश्वसनीय सॉफ्टकीबोर्ड को छिपाने

मैं इन की कोशिश की है अब तक और बताएँ कि इन विश्वसनीय नहीं हैं:

क्योंकि मैं editTexts के बहुत सारे, और अन्य दृश्य दिखाई देते हैं यह एक काम नहीं किया। मुझे एक और सामान्य की आवश्यकता है, जिसे संभवतः तर्क के रूप में देखने की आवश्यकता नहीं है।

InputMethodManager imm = (InputMethodManager)getSystemService(
    Context.INPUT_METHOD_SERVICE); 
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0); 

यह एक मेरे लिए बिल्कुल काम नहीं करता है:

getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 

यह एक काम करता है, लेकिन तुरंत फिर से कुंजीपटल पॉप जब दृश्य रूप से फ़्लिप किया।

InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE); 
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0); 

यह कभी-कभी काम करता है, लेकिन getCurrentFocus() अधिकांश समय शून्य हो जाता है।

InputMethodManager inputManager = (InputMethodManager)    
Context.getSystemService(Context.INPUT_METHOD_SERVICE); 
inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(),  
InputMethodManager.HIDE_NOT_ALWAYS); 

यह एक केवल तभी कारगर साबित कुंजीपटल दिखाया गया है:

getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_BACK); 

यह एक कोड के पहले टुकड़े की तरह EditText साथ काम नहीं करता है, लेकिन जड़ लेआउट, जो उन्मुखीकरण परिवर्तन पर परिवर्तन के साथ और हर बार ऑनक्वेट कहा जाता है। मेरे पास लैंडस्केप/पोर्ट्रेट और सामान्य/बड़े के लिए अलग-अलग लेआउट एक्सएमएल है। सभी रूट लेआउट में आईडी root है। यह पहली बार अच्छी तरह से काम करता है, लेकिन उसके बाद, यह अब और काम नहीं करता है।

InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
inputManager.hideSoftInputFromWindow(findViewById(R.id.root).getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); 

मुनाफा: softkeyboard छुपा तरीकों में से मैं कोशिश की है hella बहुत है, लेकिन उनमें से कोई भी मज़बूती से काम करने के लिए लगता है। क्या कोई सॉफ़्टवेयर को विश्वसनीय रूप से छिपाने के लिए विधि है?

उत्तर

6

चूंकि आप एक EditText जरूरत कुंजीपटल, पहली विधि को लाने के विशेष रूप से एक खोजने के लिए और उपयोग करने के लिए आप कीबोर्ड छिपाने के लिए प्रदर्शन किया।

public static ArrayList<View> getAllViewsFromRoots(View...roots) { 
    ArrayList<View> result = new ArrayList<View>(); 
    for (View root : roots) { 
     getAllViews(result, root); 
    } 
    return result; 
} 

private static void getAllViews(ArrayList<View> allviews, View parent) { 
    allviews.add(parent); 
    if (parent instanceof ViewGroup) { 
     ViewGroup viewGroup = (ViewGroup)parent; 
     for (int i = 0; i < viewGroup.getChildCount(); i++) { 
      getAllViews(allviews, viewGroup.getChildAt(i)); 
     } 
    } 
} 

फिर, एक EditText जो दिख रहा है मिल: सबसे पहले, सभी दृश्यों मिलता है।

public static EditText getEditText(View root) { 
    ArrayList<View> views = getAllViewsFromRoots(root); 
    for (View view : views) { 
     if (view instanceof EditText && view.getVisibility() == View.VISIBLE) { 
      return (EditText) view; 
     } 
    } 
    return null; 
} 

कहीं कॉल:

Toolkit.getEditText(((ViewParent) findViewById(android.R.id.content)).getChildAt(0)); 
उस के साथ

, छुपा विधि कॉल।

+0

कुछ परीक्षण के बाद, यह सबसे विश्वसनीय तरीका प्रतीत होता है। – stealthjong

+0

क्या आप कोड उदाहरण भेज सकते हैं? मुझे Toolkit.getEditText (((ViewParent) findViewById (android.R.id.content) कहां रखना चाहिए)। getChildAt (0)); ? – eyal

+0

मुझसे शादी करो !! मैं इतने लंबे समय तक एक अच्छा समाधान खोज रहा था। ऐसा लगता है कि मुझे एक अच्छा (और छोटा) मिला। धन्यवाद! –

4

यह एक मेरे लिए काम करता हमेशा:

InputMethodManager im = (InputMethodManager) getSystemService(MyActivity.INPUT_METHOD_SERVICE); 
im.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); 
+0

मेरे लिए नहीं, कभी-कभी यह काम करता है, 90% समय – stealthjong

9

मुझे लगता है कि अगर आप getCurrentFocus() की अशक्त मामले को संभालने के लिए, आप के लिए तैयार हैं। मैं नीचे दी गई विधि का उपयोग करता हूं और यह एक आकर्षण की तरह काम करता है!

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0); 

हालांकि, आपको EditText की आवश्यकता होगी:

 /* Hide Keyboard */ 
    public static void hideKeyboard(Activity activity){ 
     InputMethodManager inputMethodManager = (InputMethodManager)activity 
       .getSystemService(Context.INPUT_METHOD_SERVICE); 
     View focus = activity.getCurrentFocus(); 
     if(focus != null) 
      inputMethodManager.hideSoftInputFromWindow(focus.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); 
    } 
+1

व्यूफ्लिपर का उपयोग करते समय, व्यू फोकस शून्य है और इस प्रकार कीबोर्ड छुपा नहीं है। शायद दृश्यफ्लिपर के साथ एक समस्या है? संपादित करें: शायद नहीं, घूर्णन स्क्रीन कीबोर्ड को छिपाती नहीं है – stealthjong

+0

क्या आप वाकई सही गतिविधि पार कर रहे हैं और विधि को सही जगह पर बुला रहे हैं? मुझे लगता है कि कीबोर्ड खुला है, तो देखें फोकस शून्य नहीं होना चाहिए। – ayorhan

0

केवल इस समाधान मेरे लिए काम किया:

mActivity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 

मैं इनपुट क्षेत्र के साथ एक संवाद था, छुपा संवाद फ्लॉप छिपाने टेबलेट पर कुंजीपटल।

0

यह ज्यादातर मामलों के लिए काम करना चाहिए।

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
imm.hideSoftInputFromWindow(new View(this).getWindowToken(), 0); 

नल पॉइंटर के बारे में चिंता करने की कोई आवश्यकता नहीं है।