我有一项活动,我通常希望在多个任务中存在,以便[Back]按钮恢复以前的状态;但是,我还希望将SearchView与现有活动一起使用,而不是将新的活动推送到任务堆栈(因为我想搜索当前显示的内容)。这是我的问题:
我找不到任何方式让SearchView使用意图标志(例如FLAG_ACTIVITY_SINGLE_TOP。我尝试反过来,将启动模式设置为“singleTop”,然后将FLAG_ACTIVITY_NEW_TASK添加到每个意图,但仅在从不同的活动类启动时才有效;当我尝试从其自己的类启动活动的新实例时,Android不尊重FLAG_ACTIVITY_NEW_TASK并且没有将新任务推送到堆栈。
也许我可以在Activity.onNewIntent中执行某些操作来强制活动克隆自己。
我即将放弃SearchView,只是编写我自己的自定义小部件,尽管“从Android 3.0开始,使用SearchView小部件作为操作栏中的项目是首选方式在您的应用中提供搜索“(Source) - 到目前为止,它似乎太不灵活且不可配置,无法在非平凡的情况下使用。
有没有人找到解决这个问题的方法?
答案 0 :(得分:4)
经过大量的反思和错误的开始,我意识到SearchView对于这项任务来说简直是错误的。 Google将SearchView设计为一种特定类型的搜索活动:
这不是我使用的搜索模型;相反,我想使用查询来优化屏幕上当前显示的列表 - 它更像是过滤搜索而不是同步查询和响应模型。 SearchView不是为此设计的,所以我继续编写自己的小部件(并将其绑定到搜索菜单项和搜索按钮)。
我很惊讶没有人对这个问题有任何评论 - 通常Android问题产生了很多讨论。我想这就太远了。
答案 1 :(得分:1)
我遇到与OP相同的问题,但有一个解决方案并不意味着放弃使用SearchView
。这不是完美的解决方案,但它相当干净,似乎运作良好。
正如OP所说......
当我尝试从自己的类中启动活动的新实例时,Android不尊重FLAG_ACTIVITY_NEW_TASK并且没有将新任务推送到堆栈
...所以我的解决方案是通过中间活动。为此,我创建了一个DummyActivity
类,它基本上采用了原始意图并将其转发到您的目标活动。
所以,从我原来的活动开始,而不是打电话......
Intent destinationIntent = new Intent(getActivity(), DestinationActivity.class);
startActivity(destinationIntent);
......我打电话给...
/*
* Create the intent as normal, but replace our destination Activity with DummyActivity
*/
Intent dummyIntent = new Intent(getActivity(), DummyActivity.class);
/*
* This will make it so that if user clicks back from the next activity, they won't be shown DummyActivity
*/
dummyIntent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
/*
* Tell DummyActivity about the destination Activity
*/
dummyIntent.putExtra(DummyActivity.EXTRA_DESTINATION_ACTIVITY, YourDestinationActivity.class); //IMPORTANT - the destination Activity must implement Serializable
/*
* If you want, you can add any other extras to dummyIntent (which will be passed through to the destination activity). Launch DummyActivity.
*/
startActivity(dummyIntent);
在我的清单中,DesinationActivity被定义为singleTop。
唯一需要的是DummyActivity类,它不需要任何主要的自定义......
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
public class DummyActivity extends Activity {
public static final String EXTRA_DESTINATION_ACTIVITY = "uk.co.mobilewebexpert.EXTRA_DESTINATION_ACTIVITY";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_dummy);
Intent intent = getIntent();
/*
* Get destination activity info
*/
@SuppressWarnings("unchecked")
Class<Activity> destinationActivity = (Class<Activity>) intent.getSerializableExtra(EXTRA_DESTINATION_ACTIVITY);
Bundle destinationActivityExtras = intent.getExtras();
/*
* Launch destination activity
*/
Intent destinationActivityIntent = new Intent(this, destinationActivity);
destinationActivityIntent.putExtras(destinationActivityExtras);
destinationActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(destinationActivityIntent);
}
/**
* Override super.onNewIntent() so that calls to getIntent() will return the latest
* intent, rather than the first intent.
*/
@Override
public void onNewIntent(Intent intent){
super.onNewIntent(intent);
setIntent(intent);
}
}
希望这对你也有用。建议欢迎。欢呼声。