Android 如何将意向结果数据发送到后面的2个活动(跳过上一个活动)?
我创建了一个具有自定义建议功能的应用程序Android 如何将意向结果数据发送到后面的2个活动(跳过上一个活动)?,android,android-intent,Android,Android Intent,我创建了一个具有自定义建议功能的应用程序MainActivity将显示项目列表,并且还具有一个SearchView以从列表中搜索内容。当用户在搜索视图上放置内容时,将显示建议列表。当我单击其中一个建议时,它会将建议中的意图数据发送到可搜索的活动(SearchActivity)。在此活动中,它将检查意图是否来自ACTION\u SEARCH或ACTION\u VIEW。如果ACTION\u SEARCH,它将在此活动中显示查询。否则,它将发送打开DetailsActivity的意图。在Detail
MainActivity
将显示项目列表,并且还具有一个SearchView
以从列表中搜索内容。当用户在搜索视图
上放置内容时,将显示建议列表。当我单击其中一个建议时,它会将建议中的意图数据发送到可搜索的活动(SearchActivity
)。在此活动中,它将检查意图是否来自ACTION\u SEARCH
或ACTION\u VIEW
。如果ACTION\u SEARCH
,它将在此活动中显示查询。否则,它将发送打开DetailsActivity
的意图。在DetailsActivity
中,用户可以删除此项目。当用户单击删除按钮时,DetailsACtivity
将意向结果发送到MainActivity
,跳过SearchActivity
(我在SearchActivity
发送意向打开DetailsACtivity
时使用finish)。我的代码没有显示错误,但我的项目没有被删除,为什么意图结果不起作用
下面是我的代码片段
MainActivity.java
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch(requestCode) {
case 12345:
if(resultCode == RESULT_OK) {
int pos = data.getIntExtra("DELETE", -1);
itemList.remove(pos);
mAdapter.notifyItemRemoved(pos);
}
break;
}
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menu_search, menu);
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
}
private void handleIntent(Intent intent) {
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
String query = intent.getStringExtra(SearchManager.QUERY);
txtQuery.setText("Search Query: " + query);
} else if (Intent.ACTION_VIEW.equals(intent.getAction())) {
Intent detail = new Intent(this, DetailsActivity.class);
int pos = intent.getIntExtra(SearchManager.EXTRA_DATA_KEY);
intent.putExtra("POS", pos);
startActivityForResult(detail, 12345);
finish();
}
}
removeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int pos = getIntent().getIntExtra("POS", -1);
Intent intent = new Intent();
intent.putExtra("DELETE", pos);
setResult(RESULT_OK, intent);
finish();
}
});
SearchActivity.java
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch(requestCode) {
case 12345:
if(resultCode == RESULT_OK) {
int pos = data.getIntExtra("DELETE", -1);
itemList.remove(pos);
mAdapter.notifyItemRemoved(pos);
}
break;
}
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menu_search, menu);
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
}
private void handleIntent(Intent intent) {
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
String query = intent.getStringExtra(SearchManager.QUERY);
txtQuery.setText("Search Query: " + query);
} else if (Intent.ACTION_VIEW.equals(intent.getAction())) {
Intent detail = new Intent(this, DetailsActivity.class);
int pos = intent.getIntExtra(SearchManager.EXTRA_DATA_KEY);
intent.putExtra("POS", pos);
startActivityForResult(detail, 12345);
finish();
}
}
removeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int pos = getIntent().getIntExtra("POS", -1);
Intent intent = new Intent();
intent.putExtra("DELETE", pos);
setResult(RESULT_OK, intent);
finish();
}
});
DetailsActivity.java
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch(requestCode) {
case 12345:
if(resultCode == RESULT_OK) {
int pos = data.getIntExtra("DELETE", -1);
itemList.remove(pos);
mAdapter.notifyItemRemoved(pos);
}
break;
}
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menu_search, menu);
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
}
private void handleIntent(Intent intent) {
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
String query = intent.getStringExtra(SearchManager.QUERY);
txtQuery.setText("Search Query: " + query);
} else if (Intent.ACTION_VIEW.equals(intent.getAction())) {
Intent detail = new Intent(this, DetailsActivity.class);
int pos = intent.getIntExtra(SearchManager.EXTRA_DATA_KEY);
intent.putExtra("POS", pos);
startActivityForResult(detail, 12345);
finish();
}
}
removeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int pos = getIntent().getIntExtra("POS", -1);
Intent intent = new Intent();
intent.putExtra("DELETE", pos);
setResult(RESULT_OK, intent);
finish();
}
});
您需要使用结果转发
main活动
使用startActivityForResult()启动SearchActivity
SearchActivity
应该像这样启动DetailsActivity
:
Intent intent = new Intent(this, DetailsActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
startActivity(intent);
finish();
这告诉框架,DetailsActivity
的结果应该返回到MainActivity
注意使用startActivity()
启动DetailsActivity
和不启动startActivityForResult()
而不是setResult(RESULT\u OK,intent)代码>使用设置结果(12345,意图)
用于接收结果。删除else循环中的finish()
方法,如果您正在完成活动,您将如何接收结果…它仍然不起作用。没有finish()
,如果我单击“上一步”按钮而不是跳过它并转到“主要活动”,则DetailsActivity将返回到SearchActivity。Mr stackex结果将传递到您调用的活动…您正在调用startActivityForResult()
来自SearchActivity
您正在尝试从MainActivity获取结果..啊,没错。您知道如何将项目标识符发送到MainActivity,以便我可以将其从MainActivity中删除吗?注意:如果我在MainActivity中单击itemList中的项目,它将转到detailsActivity,如果我单击removeButton,该项目将被正常删除。问题是我通过SearchActivity从搜索建议转到DetailsActivity。谢谢,这让我有了一些见解,但既然我使用searchview从MainActivity启动SearchActivity,那么如何使用startActivityForResult()
启动SearchActivity呢?