2013-10-11 14 views
10

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

MainActivity (केवल गतिविधि):

public class MainActivity extends ActionBarActivity { 
Menu mMenu; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    //getSupportActionBar().setDisplayShowTitleEnabled(false); 
    setContentView(R.layout.activity_main); 

    handleIntent(getIntent()); 
} 

@Override 
protected void onNewIntent(Intent intent) { 
    handleIntent(intent); 
} 

private void handleIntent(Intent intent) { 
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) { 
     String query = intent.getStringExtra(SearchManager.QUERY); 
     //use the query to search your data somehow 
    } 
} 

@SuppressLint("NewApi") 
@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    mMenu = menu; 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 



    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
     SearchManager searchManager = 
       (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
     SearchView searchView = 
       (SearchView) menu.findItem(R.id.search).getActionView(); 
     searchView.setSearchableInfo(
       searchManager.getSearchableInfo(getComponentName())); 
     searchView.setIconifiedByDefault(false); 
    } 


    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.search: 
      onSearchRequested(); 
      return true; 
     default: 
      return false; 
    } 
} 

@SuppressLint("NewApi") 
@Override 
public boolean onSearchRequested() { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { 
     MenuItem mi = mMenu.findItem(R.id.search); 
     if(mi.isActionViewExpanded()){ 
      mi.collapseActionView(); 
     } else{ 
      mi.expandActionView(); 
     } 
    } else{ 
     //onOptionsItemSelected(mMenu.findItem(R.id.search)); 
    } 
    return super.onSearchRequested(); 
} 
} 

main.xml (मेनू xml):

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:com.brianco.andypedia="http://schemas.android.com/apk/res-auto" > 

<item android:id="@+id/search" 
     android:title="@string/action_settings" 
     android:icon="@drawable/ic_launcher" 
     android:actionProviderClass="android.support.v7.widget.ShareActionProvider" 
     com.brianco.andypedia:showAsAction="always|collapseActionView" 
     com.brianco.andypedia:actionViewClass="android.support.v7.widget.SearchView" /> 

<item 
    android:id="@+id/action_settings" 
    android:orderInCategory="100" 
    android:showAsAction="never" 
    android:title="@string/action_settings"/> 

</menu> 

searchable.xml:

<?xml version="1.0" encoding="utf-8"?> 
<searchable xmlns:android="http://schemas.android.com/apk/res/android" 
    android:label="@string/app_name" 
    android:hint="@string/search_hint" 
    android:voiceSearchMode="showVoiceSearchButton|launchRecognizer" /> 
प्रकट में

:

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/Theme.AppCompat.Light.DarkActionBar" > 
    <activity 
     android:name="com.brianco.andypedia.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> 

    <meta-data android:name="android.app.default_searchable" 
     android:value=".MainActivity" /> 

उत्तर

2

ठीक है, समस्या को ऑनर्स इटैम चयन (मेनूइटम आइटम) में SearchRequested() पर कॉल करने के साथ करना था। जब मेरे पास एक खोज दृश्य है तो यह अनावश्यक है और केवल पुराने प्लेटफॉर्म पर ही बुलाया जाना चाहिए।

तो, मैंने हनीकॉम के तहत उपकरणों के लिए एक अलग मेनू आइटम बनाया। इसे नए उपकरणों के लिए रनटाइम पर हटा दिया जाता है। पुराने डिवाइस के लिए रनटाइम पर SearchView हटा दिया गया है।

देखें नीचे अद्यतन कोड:

@SuppressLint("NewApi") 
@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    mMenu = menu; 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 



    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
     //remove old 
     menu.removeItem(R.id.search_old); 
     SearchManager searchManager = 
       (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
     SearchView searchView = 
       (SearchView) menu.findItem(R.id.search).getActionView(); 
     searchView.setSearchableInfo(
       searchManager.getSearchableInfo(getComponentName())); 
     searchView.setIconifiedByDefault(false); 
    } else{ 
     //remove new 
     menu.removeItem(R.id.search); 
    } 


    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.search_old: 
      onSearchRequested(); 
      return true; 
     default: 
      return false; 
    } 
} 

@SuppressLint("NewApi") 
@Override 
public boolean onSearchRequested() { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { 
     MenuItem mi = mMenu.findItem(R.id.search); 
     if(mi.isActionViewExpanded()){ 
      mi.collapseActionView(); 
     } else{ 
      mi.expandActionView(); 
     } 
    } else{ 
     //onOptionsItemSelected(mMenu.findItem(R.id.search)); 
    } 
    return super.onSearchRequested(); 
} 
11

अपने मैनिफ़ेस्ट फ़ाइल में अपने <activity> के लिए निम्न विशेषता जोड़ने के लिए प्रयास करें:

android:launchMode="singleTop" 

यह खोज अभिप्राय प्राप्त करने के लिए एक ही गतिविधि कर देगा।

अधिक यहाँ जानकारी: http://developer.android.com/guide/topics/manifest/activity-element.html

इसके अलावा, आप है <intent-filter> दो बार घोषित, आप इसे एक तत्व में विलय कर देना चाहिए।

+0

धन्यवाद, मैंने अपना मैनिफेस्ट अपडेट किया। यह मेरी समस्या नहीं थी, लेकिन यह जानना वाकई अच्छा है। मेरे पास होने वाली समस्या के समाधान के लिए मेरा उत्तर देखें। –

+0

बढ़िया, मेरे लिए भी जानना अच्छा है! – Szymon

+1

फिल द्वारा समझाए गए अनुसार अपनी खोज क्वेरी को संसाधित करने के लिए onNewIntent() विधि का उपयोग करना याद रखें। – djondal

21
Setting Up the Search Interface से एंड्रॉयड प्रलेखन में

:

अपने खोजा गतिविधि में, अपने OnCreate() विधि में इसके लिए जाँच द्वारा ACTION_SEARCH आशय संभाल।

नोट: यदि आपका खोजा गतिविधि एकल शीर्ष मोड में लॉन्च हैं (एंड्रॉयड: launchMode = "singleTop"), भी ACTION_SEARCH विधि onNewIntent() में आशय संभाल। एकल शीर्ष मोड में, का केवल एक उदाहरण आपकी गतिविधि बनाई गई है और आपकी गतिविधि शुरू करने के लिए बाद में कॉल स्टैक पर एक नई गतिविधि नहीं बनाते हैं। यह लॉन्च मोड उपयोगी है ताकि उपयोगकर्ता को हर बार एक नई गतिविधि उदाहरण बनाये बिना एक ही गतिविधि से खोज कर सकें।

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