2012-10-31 19 views
8

निम्नलिखित जांचें: How to have clicking the phone's search button do nothing?एंड्रॉइड - खोज बटन को कैसे अक्षम करें, SearchRequested() पर कैसे कार्यान्वित करें?

लेकिन यह मेरे लिए काम नहीं करता है। किसी के पास कोई अन्य सुझाव है? धन्यवाद। फिल के सुझाव के बाद कोड को उनके उत्तर के अनुसार अद्यतन करना। बग दिखाता है http://www.youtube.com/watch?v=9lekcH1JAf0&feature=youtu.be

इसलिए मैंने नमूना प्रोजेक्ट बनाया है। मैंने इसे दो अलग-अलग फोनों, एंड्रॉइड संस्करण 2.3.5 और 4.1 पर परीक्षण किया है, मैंने यह भी एमुलेटर संस्करण 2.2 पर परीक्षण किया है। बटन शो संवाद पर क्लिक करने के बाद, यह प्रगति संवाद को ठीक दिखाता है, और इसे ऐसा करना जारी रखना चाहिए। लेकिन फोन पर खोज बटन पर क्लिक करके और एमुलेटर प्रगति संवाद गायब हो जाता है। यहां वर्ग है, और मैनिफेस्ट निम्नानुसार है।

वर्तमान व्यवहार यह है कि जब खोज बटन क्लिक किया जाता है तो प्रगति संवाद गायब हो जाता है। अपेक्षित या आवश्यक व्यवहार खोज बटन को अक्षम करना है, या इसी तरह जब संवाद दिखाया जा रहा है और खोज बटन क्लिक किया गया है, तो यह क्लिक संवाद गायब नहीं होता है।

package com.example.test6; 

import android.os.Bundle; 
import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.Context; 
import android.util.Log; 
import android.view.KeyEvent; 
import android.view.Menu; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 

public class MainActivity extends Activity { 

    Button showDialogButton; 
    Context context; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     showDialogButton = (Button) findViewById(R.id.showDialogButton); 
     showDialogButton.setOnClickListener(showDialog); 
     context = this; 
     startSearch(null, false, null, false); 
    } 

    private OnClickListener showDialog = new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      ProgressDialog progressDialog = new ProgressDialog(context); 
      progressDialog.show(); 
     } 
    }; 

    @Override 
    public boolean onSearchRequested() { 
     Log.d("onSearchRequested", "search key pressed"); 
     return false; 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 
} 

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.test6" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="1" 
     android:targetSdkVersion="15" /> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name=".MainActivity" 
      android:label="Test6" > 
      <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" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
     <meta-data 
      android:name="android.app.searchable" 
      android:resource="@xml/searchable" /> 
     </activity> 
    </application> 

</manifest> 

मेरा खोज योग्य एक्सएमएल उपलब्ध है संदर्भ के अनुसार res/xml/searchable.xml पर है। यह कैसे मेरे searchable.xml की तरह लग रहा है:

<?xml version="1.0" encoding="utf-8"?> 
<searchable xmlns:android="http://schemas.android.com/apk/res/android" 
    android:searchSuggestAuthority="dictionary" 
    android:searchSuggestIntentAction="android.intent.action.VIEW" 
    android:includeInGlobalSearch="true"> 
</searchable> 
+1

हमें अपना कोड दिखाएं, यह सुझाव # 1 है। – dbDev

+0

जब आप कहते हैं कि "यह काम नहीं करता है", तो क्या आपका मतलब है कि आपको लॉगिंग नहीं दिखाई दे रही है या फोन अभी भी खोज लॉन्च करता है? – DeeV

+0

सही, मुझे अपने ऑनक्रेट() में SearchRequested() को डाले बिना लॉगिंग नहीं दिख रहा है। और खोज लॉन्च नहीं की गई है, लेकिन मेरे संवाद गायब हो गए हैं। –

उत्तर

4

संपादित

खुशी है कि नीचे मेरी कोड मददगार था। अपने अपडेट किए गए सवाल के साथ (वीडियो के साथ), मैं अब मानना ​​है कि इस सवाल का जवाब आप की जरूरत है: Prevent ProgressDialog from being dismissed when I click the search button (Android)

- पूर्व-संपादन -

onCreate() से onSearchRequested() बुला के बजाय

, आप कॉल करने की जरूरत है :

startSearch(null, false, null, false); 

फिर, onSearchRequested() विधि का उपयोग करने से खोज बटन को रोकने के लिए, आप इसे ओवरराइड और झूठे वापसी:

@Override 
public boolean onSearchRequested() 
{ 
    return false; 
} 

यह समाधान सीधे onSearchRequested documentation में चर्चा की है:

आप इस समारोह खोज UI लॉन्च करने का आसान तरीका के रूप में, के भीतर एक मेनू आइटम के लिए प्रतिक्रिया, खोज बटन, या अन्य विजेट में उपयोग कर सकते हैं अपने गतिविधि। जब तक कि इस फ़ंक्शन को कॉल न किया जाए, कॉलिंग स्टार्टशर्च (शून्य, झूठी, शून्य, झूठी) को कॉल करना है, जो वर्तमान मेनिफेस्ट में निर्दिष्ट वर्तमान गतिविधि के लिए खोज लॉन्च करता है, SearchManager देखें।

आप वैश्विक खोज को मजबूर करने के लिए इस फ़ंक्शन को ओवरराइड कर सकते हैं, उदा। में एक समर्पित खोज कुंजी की प्रतिक्रिया, या पूरी तरह से खोज को अवरुद्ध करने के लिए ( बस झूठी वापसी)।

आपका AndroidManifest.xml भी अपूर्ण है। आपको यह दिखाने की ज़रूरत है कि आपका Activity खोजने योग्य है। इस प्रकार अपने MainActivity घोषणा बदलें:

<activity 
     android:name=".MainActivity" 
     android:label="@string/title_activity_main" > 
     <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" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
     <meta-data 
      android:name="android.app.searchable" 
      android:resource="@xml/searchable" /> 
    </activity> 

ध्यान दें कि @ xml/खोजा कि खोज करने के लिए कैसे परिभाषित करता है आपके apk में एक xml संदर्भ है। इस संसाधन पर विस्तार से here पर चर्चा की गई है।

+0

धन्यवाद फिल, मुझे लगता है कि मैं (हम हैं) करीब हैं। लेकिन फिर भी, बग बनी हुई है। क्या मैं कुछ गलत कर रहा हूँ? एक वीडियो संलग्न, कोड अद्यतन किया। –

+0

@NomanArain मैंने एक संपादन किया है जो मुझे लगता है कि आपको आपकी समस्या को ठीक करने के लिए नेतृत्व मिलेगा – Phil

+0

मुझे नहीं पता कि क्या बदल गया है। क्या आप जो लिंक प्रदान कर रहे हैं उसे इंगित कर रहे हैं? –

0
@Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if (keyCode == KeyEvent.KEYCODE_SEARCH) { 
      Log.d("onKeyDown", "search key pressed"); 
      // onSearchRequested(); 
      return true; // You need to return true here. This tells android that you consumed the event. 
     } 
     return false; 
    } 
+0

इस कोड ने समस्या को ठीक नहीं किया है। –

+0

मैं आपकी समस्या को पुन: उत्पन्न नहीं कर सकता। –

+0

आप ऊपर दिए गए कोड का उपयोग कर रहे हैं? क्या आपने इस एमुलेटर पर कोशिश की है जिसका मैंने उल्लेख किया है? –

0
@Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if (keyCode == KeyEvent.KEYCODE_SEARCH && event.getRepeatCount() == 0) { 
      return true; 
     } 
     return false; 
    } 

http://developer.android.com/reference/android/view/KeyEvent.html

+0

दुर्भाग्यवश यह समस्या को ठीक नहीं करता है। कोशिश करने के लिए धन्यवाद। –

0

आप अपनी गतिविधि में खोज महत्वपूर्ण घटना को बाधित नहीं कर सकते हैं।

आपको अपने संवाद में खोज कुंजी ईवेंट को बाधित करना होगा।

private OnClickListener showDialog = new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     ProgressDialog progressDialog = new ProgressDialog(context); 
     progressDialog.setOnKeyListener(new OnKeyListener(){ 
       public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event)  { 
       if (keyCode == KeyEvent.KEYCODE_SEARCH) { 
        Log.d("onKeyDown", "search key pressed"); 
        return true; 
       } 
       return super.onKey(dialog,keyCode,event); 
    }}); 
     progressDialog.show(); 
    } 
}; 
+0

मुझे नहीं पता कि मुझे यह समझ में नहीं आ रहा है? http://developer.android.com/reference /android/app/Activity.html#onSearchRequested%28%29 "आप वैश्विक खोज को मजबूर करने के लिए इस फ़ंक्शन को ओवरराइड कर सकते हैं, उदाहरण के लिए समर्पित खोज कुंजी के जवाब में, या पूरी तरह से खोज को अवरुद्ध करने के लिए (केवल झूठी वापसी करके)।" खोज उपरोक्त पृष्ठ पर खोज के लिए। –

+0

@ नोमन एरेन, क्या आपने मेरे सुझाव के साथ प्रयास किया है?यह keyevent प्रेषण के बारे में है। प्रोग्रेसडियलॉग भी एक खिड़की है। तो यह खुद को keydispatching है। इसलिए आपको गतिविधि में बजाय खोज में खोज कुंजी को बाधित करना चाहिए। – landry

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