私はツールバーに検索ビューを作成するために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:
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を使用してコンテンツプロバイダクラスのデータを取得しています
http://stackoverflow.com/a/2091482/4706693を参照してください。ユーザーが提案した国や都市などの必要な情報を渡します。 – NSimon
@NicolasSimonアクティビティ間でデータを渡す方法を知っています。ここで検索すると、データを渡すために使用されるコードを追加する場所がわからず、コンテンツプロバイダを使用しているため、把握できません – ukama