Android 以片段而不是活动显示搜索结果
我正试图在现有应用程序中实现搜索,如下示例:Android 以片段而不是活动显示搜索结果,android,android-fragments,Android,Android Fragments,我正试图在现有应用程序中实现搜索,如下示例: 该应用程序使用fragment replace来更改显示,因此我尝试在另一个片段中显示结果,而不是创建另一个活动。问题是,当输入一个搜索字符串并使用放大类时,不会调用任何处理程序 我认为主要问题在于main活动中的代码。onCreateOptions菜单(): 使用MainActivity.class调用SetSearchListFragment(),什么都不做,使用SearchListFragment.class调用它会导致NPE 我在这里创建了
该应用程序使用fragment replace来更改显示,因此我尝试在另一个片段中显示结果,而不是创建另一个活动。问题是,当输入一个搜索字符串并使用放大类时,不会调用任何处理程序 我认为主要问题在于
main活动中的代码。onCreateOptions菜单()
:
使用MainActivity.class
调用SetSearchListFragment()
,什么都不做,使用SearchListFragment.class
调用它会导致NPE
我在这里创建了一个SSCCE:您能看到如何解决此问题吗?以下内容将为您提供大部分解决方法: 按如下方式更改您的清单:
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.SEARCH" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable" />
</activity>
onNewIntent
@Override
public void onNewIntent(Intent intent) {
Log.d("onNewIntent", "here!");
}
您必须展开onNewIntent
才能进行搜索。Intent
包含搜索条件。有关详细信息,请参阅
我认为这些都是修改。这不是一个完整的解决方案,但我希望它能帮助您解决其余问题。我不确定您想做什么。您引用的示例中缺少了一些内容,例如在清单中定义搜索
活动
,以及处理搜索意图
。您是否试图使用搜索片段
代替活动
?我遗漏了什么?我正在尝试使用MainActivity,而不是其他activity。目前,该应用程序显示所有员工的列表,搜索到的员工列表是其中的一个子集,因此它会看到我可以以某种方式以类似于所有员工列表的方式显示该列表。我将尝试此方法,但我不确定它是否会起作用。我尝试玩了onNewIntent
,但无法让它工作,因为只有在活动重新启动时才会调用它。请确保将android:launchMode=“singleTop”
放入清单,否则搜索将通过onCreate
,而这不是您想要的。这会有用的。我已经实现了你建议的代码。现在调用onNewIntent更好。当我之前尝试过它时,我认为我没有在清单中正确设置它(基于查看代码)。仍然存在一个问题,列表未显示。将显示标题,但不显示列表。在调试过程中,我看到适配器中的列表正在构建中,但不知何故没有显示出来。我已将更改推送到github项目,以便您查看。明白了。适配器缺少一条相当重要的线路。谢谢你的专业知识。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_main, menu);
// Associate searchable configuration with the SearchView
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
// ComponentName componentName = new ComponentName(this, SearchListFragment.class);
// searchView.setSearchableInfo(searchManager.getSearchableInfo(componentName));
return true;
}
@Override
public void onNewIntent(Intent intent) {
Log.d("onNewIntent", "here!");
}