47

मेरे पास एक्शनबार में एक खोज दृश्य है। जब उपयोगकर्ता इनपुट के साथ किया जाता है तो मैं कीबोर्ड को खारिज करना चाहता हूं। मैं SearchView पर queryTextListener निम्नलिखित हैएंड्रॉइड सर्च व्यू में कीबोर्ड कैसे खारिज करें?

final SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() { 
    @Override 
    public boolean onQueryTextChange(String newText) { 
     // Do something 
     return true; 
    } 

    @Override 
    public boolean onQueryTextSubmit(String query) { 

     showProgress(); 
     // Do stuff, make async call 

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

     return true; 
    } 
}; 

इसी तरह के सवाल के आधार पर, निम्न कोड कीबोर्ड ख़ारिज करना चाहिए, लेकिन यह इस मामले में काम नहीं करता है:

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

मैं भी कोशिश की है :

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

कोई भी काम नहीं करता है। मुझे यकीन नहीं है कि यह एक हनीकॉम्ब विशिष्ट समस्या है या यदि यह एक्शनबार में खोज दृश्य से संबंधित है, या दोनों। क्या किसी ने यह काम किया है या पता है कि यह क्यों काम नहीं करता है?

उत्तर

9

किसी तरह यह काम करता है अगर आप

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

और फिर

otherWidget.requestFocus(); 
7

मेरे लिए, निम्न कार्य फोन:

मेरी गतिविधि में मैं एक सदस्य चर राशि

private SearchView mSearchView; 

0 मेंमैं सेट कि इतने तरह चर: इस

public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.library, menu); 
    mSearchView = (SearchView)menu.findItem(R.id.miSearch).getActionView(); 
    mSearchView.setOnQueryTextListener(this); 
    return true; 
} 

पिछले पर QueryTextListener में, मैं कार्य करें:

mSearchView.setQuery("", false); 
mSearchView.setIconified(true); 

मैं SearchView के स्रोत कोड पर एक नज़र था, और आप रीसेट नहीं करते हैं, तो एक खाली स्ट्रिंग पर क्वेरी टेक्स्ट, सर्च व्यू बस ऐसा करता है, और कीबोर्ड को नहीं हटाता है। वास्तव में, स्रोत कोड में पर्याप्त गहराई से ड्रिलिंग, यह वही आता है, युकू ने सुझाव दिया, लेकिन फिर भी मुझे अपने समाधान को बेहतर पसंद है, क्योंकि मुझे उन निम्न स्तर की सामग्री के साथ गड़बड़ नहीं करना है।

1

मैं एक दोहरी फलक गतिविधि के साथ पर काम कर रहा हूँ एक गोली ऐप्लिकेशन में, मैं केवल

f.getView().requestFocus(); // f is the target fragment for the search

लिखा गया है और कहा कि एक खोज के बाद मुलायम कीबोर्ड ख़ारिज करने के लिए पर्याप्त था। InputMethodManager

59

का उपयोग करने की कोई आवश्यकता नहीं है, मैं कुछ ऐसा करने की कोशिश कर रहा था। मुझे को Activity से लॉन्च करने की आवश्यकता है और लोड होने पर खोज शब्द खोले गए खोज क्षेत्र पर दिखाई देता है। मैं ऊपर, लेकिन अंत में सब दृष्टिकोण की कोशिश की (Ridcully's answer above के समान) मैं SearchView पर onCreateOptionsMenu() में SearchView करने के लिए एक चर सेट और clearFocus() तो onQueryTextSubmit() में कहा जाता है उपयोगकर्ता एक नई खोज प्रस्तुत जब:

private SearchView searchView; 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.search_menu, menu); 
    searchView = (SearchView) menu.findItem(R.id.menu_search) 
      .getActionView(); // set the reference to the searchView 
    searchView.setOnQueryTextListener(this); 
    searchMenuItem = (MenuItem) menu.findItem(R.id.menu_search); 
    searchMenuItem.expandActionView(); // expand the search action item automatically 
    searchView.setQuery("<put your search term here>", false); // fill in the search term by default 
    searchView.clearFocus(); // close the keyboard on load 
    return true; 
} 

@Override 
public boolean onQueryTextSubmit(String query) { 
    performNewSearch(query); 
    searchView.clearFocus(); 
    return true; 
} 
+0

जहां '' query'' onCreateOptionsMenu'' '' में परिभाषित किया गया है में कीबोर्ड छिपाने के लिए के लिए काम कर रहा है? –

+0

.. यह क्वेरी स्ट्रिंग है जिसे कहीं और परिभाषित किया गया है। मैं इसे संपादित कर दूंगा। उस पंक्ति की भी आवश्यकता नहीं है, यह केवल तभी होता है जब आप क्वेरी को पूर्व-भरना चाहते हैं और दूसरा तर्क (झूठा) क्वेरी को चलाने से रोकता है। – bkurzius

+1

बहुत बहुत धन्यवाद! searchView.clearFocus() वह हिस्सा है जिसे मैं अब तक याद कर रहा हूं – satyadeepk

1

मैं ActionBarSherlock 4.3 का इस्तेमाल किया और मेरे पास प्रोग्रेसडिअलॉग है। जब मैं इसे postExecute विधि में खारिज करता हूं, तो खोज दृश्य लाभ प्राप्त करता है। इसे ठीक करने के लिए:

//Handle intent and hide soft keyboard 
    @Override 
    protected void onNewIntent(Intent intent) { 
     setIntent(intent); 
     handleIntent(intent); 
     searchView.setQuery("", false); 
     searchView.setIconified(true); 
     searchView.clearFocus(); 
    } 

    /*When dismiss ProgressDialog, searchview gain focus again and shows the keyboard. I call clearFocus() to avoid it.*/ 

    AsyncTask.onPostExecute(){ 
     if(pd!=null) 
     pd.dismiss(); 
     if(searchView!=null) 
     searchView.clearFocus(); 
    } 

आशा है कि इससे मदद मिलती है।

1

संपादित करें: मैंने शीर्ष पर बेहतर समाधान जोड़ा, लेकिन पुराने उत्तर को संदर्भ के रूप में भी रखा।

@Override 
     public boolean onQueryTextSubmit(String query) { 

        searchView.clearFocus(); 
      return false; 
     } 

मूल उत्तर: मैंने एक setOnQueryTextListener का उपयोग करके प्रोग्राम किया। जब सर्चव्यू छुपाया जाता है तो कीबोर्ड चला जाता है और फिर जब यह फिर से दिखाई देता है तो कीबोर्ड बैक अप नहीं करता है।

//set query change listener 
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener(){ 
     @Override 
     public boolean onQueryTextChange(String newText) { 
      // TODO Auto-generated method stub 
      return false; 
     } 

     @Override 
     public boolean onQueryTextSubmit(String query) { 
      /** 
      * hides and then unhides search tab to make sure keyboard disappears when query is submitted 
      */ 
        searchView.setVisibility(View.INVISIBLE); 
        searchView.setVisibility(View.VISIBLE); 
      return false; 
     } 

    }); 
+0

आप स्थिरांक के बजाए जादू संख्याओं का उपयोग क्यों कर रहे हैं? इसके अलावा, यह सिर्फ एक हैकी जवाब है। –

24

, सरल सीधे बात करने के लिए और साफ:

@Override 
    public boolean onQueryTextSubmit(String query) { 
     // your search methods 
     searchView.clearFocus(); 
     return true; 
    } 
+2

यह स्वीकार्य उत्तर होना चाहिए – AlexF11

+3

यह नहीं कहा जाता है कि 'SearchView' खाली है या नहीं ... – Sakiboy

11

सिर्फ onQueryTextSubmit पर रिटर्न फाल्स सिर्फ

नीचे
@Override 
public boolean onQueryTextSubmit(String s) { 
    return false; 
} 
0

दो समाधान है कि मेरे लिए काम किया, पहले एक का उपयोग कर की तरह सर्च व्यू उदाहरण:

private void hideKeyboard(){ 
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
    imm.hideSoftInputFromWindow(searchView.getWindowToken(), 0); 
} 
,210

दूसरा समाधान:

private void hideKeyboard(){ 
      InputMethodManager inputManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
      inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); 
} 
6

मेरे लिए, उपरोक्त में से कोई पहले प्रस्तुत करने पर काम कर रहा था। यह छुपा रहा था और फिर कीबोर्ड को तुरंत दिखा रहा था। मुझे दृश्य के हैंडलर पर clearFocus() पोस्ट करना था ताकि यह सबकुछ के साथ किया जा सके।

mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
      @Override 
      public boolean onQueryTextSubmit(String query) { 
       if (!"".equals(query)) { 
        mSearchView.post(new Runnable() { 
         @Override 
         public void run() { 
          mSearchView.clearFocus(); 
         } 
        }); 
       } 
       return true; 
      } 

      @Override 
      public boolean onQueryTextChange(String newText) { 
       return false; 
      } 
     }); 
0

कोड के नीचे मुझे SearchView

MenuItem searchItem = baseMenu.findItem(R.id.menuSearch); 

edtSearch= (EditText) searchItem.getActionView().findViewById(R.id.search_src_text); 

MenuItemCompat.setOnActionExpandListener(searchItem, new MenuItemCompat.OnActionExpandListener() { 
         @Override 
         public boolean onMenuItemActionExpand(MenuItem item) { 
          edtSearch.post(new Runnable() { 
           @Override 
           public void run() { 
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
            imm.hideSoftInputFromWindow(searchEditText.getWindowToken(), 0); 
           } 
          }); 
          return true; 
         } 

         @Override 
         public boolean onMenuItemActionCollapse(MenuItem item) { 
          return true; 
         } 
        }); 
संबंधित मुद्दे