検索マネージャーからのコールバックを処理する方法は?
-
02-10-2019 - |
質問
以下を仮定しましょう。
Activity A calls Search Manager
User searches, and search results are displayed in Activity B
User clicks on a list item in Activity B
App switches back to Activity A
検索マネージャーの意図がないので、アクティビティBからアクティビティAへのこのコールバックを処理することはできません(私は思う?)。
(アクティビティaで)検索マネージャーを呼び出す
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
switch (item.getItemId()) {
case R.id.add_symbol:
onSearchRequested(); //result of search will show Activity B
return true;
default:
return super.onOptionsItemSelected(item);
}
}
ユーザーがリスト項目を選択した後にアクティビティに戻る
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> a, View v, int position, long id) {
Quote myQuote = new Quote();
myQuote.name = (companies.get(position).name);
myQuote.symbol = (companies.get(position).symbol);
//TODO: add new quote to master quote list in Main
//TODO: serialize in Main
//TODO: go back to last activity
Intent myIntent = new Intent(getApplicationContext(), Main.class);
startActivityForResult(myIntent, PICK_COMPANY_REQUEST);
}
});
アクティビティでは、コールバックを処理します:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == PICK_COMPANY_REQUEST) {
if (resultCode == RESULT_OK) {
Toast toast = Toast.makeText(getApplicationContext(), "Stock added", Toast.LENGTH_SHORT);
toast.show();
}
}
}
PICK_COMPANY_REQUEST
コールバックに送信されることはありません。どうしてこれなの?私は、検索マネージャーがアクティビティBではなく意図を持っているためと仮定しています。これが呼び出されることを確認するにはどうすればよいですか?
onactivityResult()は決して呼び出されません。なんで?
解決
OnClickListenerでの主なアクティビティの新しい意図を呼び出す必要があるかどうかは本当に疑問です。アクティビティはすでにスタックにあるので、それを終えることができます
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> a, View v, int position, long id) {
Quote myQuote = new Quote();
myQuote.name = (companies.get(position).name);
myQuote.symbol = (companies.get(position).symbol);
//TODO: add new quote to master quote list in Main
//TODO: serialize in Main
//TODO: go back to last activity
//You need to use setresult here and pass the intent
setResult(RESULT_OK, myIntent );
finish();
}
});
他のヒント
私が同じ問題だと思うものへの答えを投稿しました Android OnSearchRequested()呼び出しアクティビティへのコールバック
Skytheは正しいです onActivityResult
アクティビティAが結果の検索アクティビティを開始していないため、呼び出されません。
これを回避するために、私は(マニフェストで)検索可能な行動として定義されたアクティビティを作成しました。 startActivityForResult
, 、クエリを渡し、アクティビティBに通常どおり検索を処理します。
上記のリンクで私の応答を見ることができます。 このブログ投稿でより詳細な記事.
StartactivityForresultは検索アクティビティを開始するために使用されないため、OnActivityResultは呼び出されません。私もこの問題に固執していて、まだ解決策を見つけていません!