2012-04-18 12 views
18

मुझे एक्शन बार में खोज दृश्य सेट करने में समस्या हो रही है।सर्चइन्फो हमेशा शून्य से बाहर आ रहा है

मैंने डेवलपर साइट का पालन किया, लेकिन यह काम नहीं करता है। मुझे यह महसूस हो रहा है कि मुझे कुछ याद आ रही है।

जब मैं अपना कोड चलाता हूं, तो यह हमेशा "खोजने योग्य जानकारी प्राप्त करने में विफल" आउटपुट करता है (MainActivity.setupSearchView())।

MainActivity.java

// package... 
// imports... 
public class MainActivity extends Activity { 
    private static String tag = "Main Activity"; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
    } 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater mi = getMenuInflater(); 
     mi.inflate(R.menu.search_view, menu); 
     setupSearchView(menu); 
     return true; 
    } 
    private void setupSearchView(Menu menu) { 
     SearchManager sm = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
     SearchableInfo si = sm.getSearchableInfo(getComponentName()); 
     if (si == null) { 
      Log.wtf(tag, "failed to get searchable info"); 
      return; 
     } 
     SearchView sv = (SearchView) menu.findItem(R.id.menu_search).getActionView(); 
     sv.setSearchableInfo(si); 
     // Do not iconify the widget; expand it by default 
     sv.setIconifiedByDefault(false); 
    } 
} 

SearchResultsActivity.java

// package... 
// imports... 
public class SearchResultsActivity extends ListActivity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     final Intent queryIntent = getIntent(); 
     doSearchQuery(queryIntent); 
    } 
    @Override 
    public void onNewIntent(final Intent newIntent) { 
     super.onNewIntent(newIntent); 
     final Intent queryIntent = getIntent(); 
     doSearchQuery(queryIntent); 
    } 
} 

searchable.xml

<?xml version="1.0" encoding="utf-8"?> 
<searchable xmlns:android="http://schemas.android.com/apk/res/android" 
    android:hint="@string/search_hint" 
    android:label="@string/search_label" > 
</searchable> 

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="kpaek.examples" 
    android:versionCode="1" 
    android:versionName="1.0" > 
    <uses-sdk android:minSdkVersion="15" /> 
    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <activity 
      android:name=".search.MainActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name=".SearchResultsActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.SEARCH" /> 
      </intent-filter> 
      <meta-data 
       android:name="android.app.searchable" 
       android:resource="@xml/searchable" /> 
     </activity> 
    </application> 
</manifest> 

उत्तर

38

मुझे मिली मुख्य बात यह है कि searchable.xml में शाब्दिक तार, केवल संसाधन शामिल हैं। मैंने उस पर आधे दिन बर्बाद कर दिया, क्योंकि इससे चुपचाप विफल होने के लिए खोज योग्य इंफो मिल जाता है।

+0

धन्यवाद! आप मेरे लिए आधे दिन बचाते हैं :) – HighFlyer

+0

वाह! यह एक बहुत बुरा बुरा है। मैंने इसे यहां बताया: https://code.google.com/p/android/issues/detail?id=37517 – Rodja

+0

आदमी - उस जानकारी के लिए बहुत बहुत धन्यवाद! – mAx

3

developersite से:

एक खोज करने योग्य विन्यास को परिभाषित करता है कि कैसे SearchView बर्ताव करता है और एक रेस/xml/searchable.xml फाइल में परिभाषित है। कम से कम, एक खोज योग्य कॉन्फ़िगरेशन में एक एंड्रॉइड होना चाहिए: लेबल विशेषता जिसमें एंड्रॉइड के समान मूल्य है: आपके एंड्रॉइड मेनिफेस्ट में तत्व का लेबल विशेषता।

एक उदाहरण के रूप में, वे बताते हैं:

<searchable xmlns:android="http://schemas.android.com/apk/res/android" 
     android:label="@string/app_name" 
     android:hint="@string/search_hint" /> 

app_name अपने प्रकट, गतिविधि के लेबल में की तरह, है। हालांकि, आपके खोजने योग्य में, लेबल search_label को संदर्भित करता है। शायद काम करता है अगर app_name और search_label बराबर हैं, लेकिन यह मेरे लिए नाजुक लगता है।

11

इसने मुझे एक दिन के लिए मार डाला - मैंने सोचा कि यह एक्शनबैरशेल-संबंधित था, लेकिन इसके साथ यह ठीक काम नहीं करता है।

समस्या यह थी कि मैं नमूना शॉर्ट सर्किट करने की कोशिश कर रहा था। कम से कम अपने गतिविधियों में से एक - एक से खोज कर रहे हैं के लिए पर्याप्त है - प्रकट में यह में इस आशय फिल्टर होना चाहिए:

<intent-filter> 
    <action android:name="android.intent.action.SEARCH" /> 
</intent-filter> 

यदि नहीं, तो searchManager.getSearchableInfo(getComponentName()) हमेशा अशक्त देता है, और अपने विन्यास अनदेखा किया जाता है।

19

मेरे मामले res/menu/mymenu.xml में कस्टम टैग का उपयोग कर में मेरे लिए काम किया:

app:showAsAction="ifRoom|collapseActionView" 
app:actionViewClass="android.support.v7.widget.SearchView" 

उपयोग न करें:

android:showAsAction="ifRoom|collapseActionView" 
android:actionViewClass="android.support.v7.widget.SearchView" 
+1

मिलता है यह मेरे लिए काम करता है। आपका बहुत बहुत धन्यवाद! –

+0

@ माहेश यह मेरे लिए भी काम करता है !!! – Tony

17

मैं ने पाया है कि इरादे फिल्टर और मेटा डेटा तत्व होना चाहिए मेनिफेस्ट गतिविधि तत्व में शामिल है, जिसमें से खोज शुरू करने के लिए खोज शुरू की जाती है (मुख्य खोजकता एक खोज दृश्य) विधि खोजने के लिए खोजने योग्य इंफो (getComponentName()) सही कॉन्फ़िगरेशन को वापस करने के लिए और शून्य नहीं है।

<activity 
    android:name=".MainActivity" 
    android:label="@string/app_name"> 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 

    <intent-filter> 
     <action android:name="android.intent.action.SEARCH" /> 
    </intent-filter> 

    <meta-data 
     android:name="android.app.searchable" 
     android:resource="@xml/searchable" /> 
</activity> 

मुझे आश्चर्य है अगर बजाय (और समाधान मैं अब के लिए साथ जा रहा हूँ) एक परिणाम गतिविधि घोषणा करने पर आमादा और मेटा डेटा छोड़ दो और (getSearchableInfo के तर्क को बदलने) के रूप में करना चाहिए:

<activity android:name=".SearchResultsActivity"> 
    <intent-filter> 
     <action android:name="android.intent.action.SEARCH" /> 
    </intent-filter> 

    <meta-data 
     android:name="android.app.searchable" 
     android:resource="@xml/searchable" /> 
</activity> 

और MainActivity में परिवर्तन (searchableInfo के लिए काम बयान पर ध्यान दें):

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.menu_search, menu); 
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
    SearchView mySearchView = (SearchView) menu.findItem(R.id.action_search).getActionView(); 
    SearchableInfo searchableInfo = searchManager.getSearchableInfo(new ComponentName(getApplicationContext(), SearchResultsActivity.class)); 
    mySearchView.setSearchableInfo(searchableInfo); 

    return true; 
} 
+1

धन्यवाद आदमी ..... मेरे लिए काम करने का एकमात्र समाधान नया घटक है एक ... मुझे नहीं पता कि क्यों सभी ने काम नहीं किया – Gaurav

+0

ओह वाह! एकमात्र समाधान जो काम करता था! अधिक उत्साह का हकदार है! – camelCaseCoder

2

मैं इस मुद्दे का सामना करना पड़ा लेकिन सलाह के ऊपर यह समाधान नहीं किया। इसके बजाय यह SearchResultActivity में श्रेणी डिफ़ॉल्ट सेट करने के लिए बाहर निकला। उदाहरण के लिए निम्नलिखित टूट जाता है:

<activity android:name=".SearchResultActivity" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme"> 
    <intent-filter> 
      <action android:name="android.intent.action.SEARCH" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
    </intent-filter> 
    <meta-data 
      android:name="android.app.searchable" 
      android:resource="@xml/searchable" /> 
</activity> 

android.intent.category.DEFAULT निकाला जा रहा है इस समस्या .:

<activity android:name=".SearchResultActivity" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme"> 
    <intent-filter> 
      <action android:name="android.intent.action.SEARCH" /> 
    </intent-filter> 
    <meta-data 
      android:name="android.app.searchable" 
      android:resource="@xml/searchable" /> 
</activity> 

इसके अलावा इस सवाल का पिछले जवाब में कोई त्रुटि है हल करता है। मुख्य गतिविधि को औरroid.app.default_searchable के साथ परिभाषित किया जाना चाहिए। android.app.searchable केवल आपके SearchResultsActivity के लिए है।

<activity 
    android:name=".MainActivity" 
    android:label="@string/app_name"> 
    <!-- other stuff--> 
    <meta-data android:name="android.app.default_searchable" 
      android:value=".SearchResultsActivity" /> 
</activity> 

जब AndroidManifest.xml सही नहीं है अंत में SearchManager एक नाजुक घटक चुप विफलताओं की संभावना है।

1

मैंने इस पर 8 पूर्ण घंटे बर्बाद कर दिए क्योंकि मैंने उपरोक्त सभी समाधानों की जांच की लेकिन मेरे लिए एक चीज गायब थी।

मेरे Android प्रकट में:

<meta-data 
       android:name="android.app.searchable" 
       android:value="@xml/searchable" /> 

चाहिए कर दिया गया है:

<meta-data 
       android:name="android.app.searchable" 
       android:resource="@xml/searchable" /> 

मेरे लिए यह चुपचाप विफल रहा था। सबसे पहले सबसे अच्छी बात यह है कि उदाहरणों की प्रतिलिपि बनाएं और पेस्ट करें। बस सुनिश्चित करें कि आपके सभी गुण बिल्कुल वही हैं।

संबंधित मुद्दे