2016-04-16 9 views
1

私はツールバーに検索ビューを作成するためにthis tutorialをフォローしています。私が望むのは、検索結果アイテムの1つをクリックして、対応するデータを詳細アクティビティに表示することですが、そのようにすることはできません。Android SearchView:データを詳細に渡す

これは私のコードです:

MainActivityクラス:

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.menu_search, menu); 

     MenuItem searchItem = menu.findItem(R.id.search); 
     SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem); 
     searchView.setOnQueryTextListener(this); 

     SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
     searchView.setSearchableInfo(searchManager.getSearchableInfo(
       new ComponentName(this, SearchableActivity.class))); 
     searchView.setIconifiedByDefault(false); 

     return true; 
    } 

    @Override 
    protected void onNewIntent(Intent intent) { 
     super.onNewIntent(intent); 
     if (Intent.ACTION_SEARCH.equals(intent.getAction())) { 
      String query = intent.getStringExtra(SearchManager.QUERY); 
      Toast.makeText(this, "Searching by: "+ query, Toast.LENGTH_SHORT).show(); 

     } else if (Intent.ACTION_VIEW.equals(intent.getAction())) { 
      String uri = intent.getDataString(); 
      Toast.makeText(this, "Suggestion: "+ uri, Toast.LENGTH_SHORT).show(); 
     } 
    } 

    @Override 
    public boolean onQueryTextSubmit(String query) { 
     // User pressed the search button 
     return false; 
    } 

    @Override 
    public boolean onQueryTextChange(String newText) { 
     // User changed the text 
     return false; 
    } 

SearchableActivityクラス:

public class SearchableActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_searchable); 
     TextView txt = (TextView)findViewById(R.id.textView); 

     Intent intent = getIntent(); 
     if (Intent.ACTION_SEARCH.equals(intent.getAction())) { 
      String query = intent.getStringExtra(SearchManager.QUERY); 
      txt.setText("Searching by: "+ query); 

     } else if (Intent.ACTION_VIEW.equals(intent.getAction())) { 
      String uri = intent.getDataString(); 
      txt.setText("Suggestion: "+ uri); 

     } 
    } 

CitySuggestionProviderクラス:

public class CitySuggestionProvider extends ContentProvider { 

    List<String> cities; 

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

    @Override 
    public Cursor query(Uri uri, String[] projection, String selection, 
         String[] selectionArgs, String sortOrder) { 
     if (cities == null || cities.isEmpty()){ 
      Log.d("NGVL", "WEB"); 
      List<CityPojo> pojos = new ArrayList<>(); 
      cities = new ArrayList<>(); 
      DatabaseHelper db = new DatabaseHelper(getContext()); 

      try { 

       try { 
        db.create(); 
       } catch (IOException ioe) { 
        throw new Error("Unable to create database"); 
       } 

       if (db.open()) { 
        pojos = db.getCities(); 
       } 
       db.close(); 



       int lenght = pojos.size(); 
       for (int i = 0; i < lenght; i++) { 
        String city = pojos.get(i).getCity(); 
        cities.add(city); 
       } 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } else { 
      Log.d("NGVL", "Cache!"); 
     } 

     MatrixCursor cursor = new MatrixCursor(
       new String[] { 
         BaseColumns._ID, 
         SearchManager.SUGGEST_COLUMN_TEXT_1, 
         SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID 
       } 
     ); 
     if (cities != null) { 
      String query = uri.getLastPathSegment().toUpperCase(); 
      int limit = Integer.parseInt(uri.getQueryParameter(SearchManager.SUGGEST_PARAMETER_LIMIT)); 

      int lenght = cities.size(); 
      for (int i = 0; i < lenght && cursor.getCount() < limit; i++) { 
       String city = cities.get(i); 
       if (city.toUpperCase().contains(query)){ 
        cursor.addRow(new Object[]{ i, city, i }); 
       } 
      } 
     } 
     return cursor; 
    } 


} 

マニフェスト:

<activity 
      android:name=".MainActivity" 
      android:launchMode="singleTop"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN"/> 

       <category android:name="android.intent.category.LAUNCHER"/> 
      </intent-filter> 
     </activity> 

     <provider 
      android:name=".CitySuggestionProvider" 
      android:authorities="ngvl.android.demosearch.citysuggestion" 
      android:enabled="true" 
      android:exported="true"/> 

     <activity android:name=".SearchableActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.SEARCH"/> 
      </intent-filter> 
      <meta-data 
       android:name="android.app.searchable" 
       android:resource="@xml/searchable"/> 
     </activity> 

searchable.xml:

enter image description here

0:

<searchable xmlns:android="http://schemas.android.com/apk/res/android" 
      android:hint="@string/hint_search" 
      android:label="@string/app_name" 
      android:voiceSearchMode="showVoiceSearchButton|launchRecognizer" 
      android:searchSuggestAuthority="ngvl.android.demosearch.citysuggestion" 
      android:searchSuggestIntentAction="android.intent.action.VIEW" 
      android:searchSuggestIntentData="content://ngvl.android.demosearch.city"/> 

Everthingは私はちょうどこの画像のような結果を得る正常に動作します

ですが、問題をクリックしてその詳細を別のアクティビティに表示したい場合があります。都市と国の2つのテキストフィールドがあるので、ユーザーが提案の都市をクリックすると、対応する国を詳細アクティビティに表示します。国のデータを詳細アクティビティに渡す方法がわかりません。私はSQLiteを使用してコンテンツプロバイダクラスのデータを取得しています

+0

http://stackoverflow.com/a/2091482/4706693を参照してください。ユーザーが提案した国や都市などの必要な情報を渡します。 – NSimon

+1

@NicolasSimonアクティビティ間でデータを渡す方法を知っています。ここで検索すると、データを渡すために使用されるコードを追加する場所がわからず、コンテンツプロバイダを使用しているため、把握できません – ukama

答えて

0

私は上記のチュートリアルの著者です:) まず最初に、サンプルが残念で十分ではなく、私はそれをよりよく説明しようとしましょう。

サンプルに記載されているコンテンツプロバイダは、検索候補のみを提供する必要があります。したがって、ユーザーがリスト内のオプションを選択すると、Uriが別のプロバイダに返されます(ほとんどの場合)。

content://ngvl.android.demosearch.city 

だから、あなたはこのウリに出席するために、コンテンツプロバイダがあり、ユーザの選択に関するすべての詳細を返す必要があります:検索可能な設定ファイル(RES/XML/searchable.xml)にこのプロパティがあることに注意してください。このため、私は第2アクティビティ(SearchableActivity.java)にUriを表示します。

しかし、私はあなたの質問に答えるためにコードを更新しました:)今、提案プロバイダは両方ともUrisに答えています: これはコミットのリンクです。 https://github.com/nglauber/playground/commit/51741babd301b42be220fc771c563da660808b20

は、ご質問があれば、私に教えてください;)

はそれが役に立てば幸い!

+0

本当に助けてくれてありがとう!! – ukama

関連する問題