我想在Android上开发一个标签式应用程序。同时,我希望搜索功能出现在某些选项卡上。出于这个原因,我在清单文件中声明了一些活动并将它们添加到TabHost中。但问题是,当我进行搜索时,它会调用驻留在选项卡内容中的当前活动的onCreate()方法。我想要的是使searchManager调用onNewIntent()方法,以便不创建新的活动,我可以处理现有活动中的搜索。我发布我的清单和TabActivity源文件更清楚:
清单文件的一部分:
<activity
android:name="KarniyarikTabsWidget"
android:label="@string/app_name"
android:theme="@android:style/Theme.NoTitleBar"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="UrunTab"
android:theme="@android:style/Theme.NoTitleBar"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<meta-data android:name="android.app.searchable"
android:resource="@xml/searchable" />
</activity>
<activity android:name="ArabaTab" android:theme="@android:style/Theme.NoTitleBar"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<meta-data android:name="android.app.searchable"
android:resource="@xml/searchable" />
</activity>
<activity android:name="GecmisTab" android:theme="@android:style/Theme.NoTitleBar"
android:launchMode="singleTop">
</activity>
<activity android:name="HakkindaTab" android:theme="@android:style/Theme.NoTitleBar"
android:launchMode="singleTop">
</activity>
Tab Activity onCreate方法:
public class KarniyarikTabsWidget extends TabActivity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Resources res = getResources(); // Resource object to get Drawables
TabHost tabHost = getTabHost(); // The activity TabHost
TabHost.TabSpec spec; // Resusable TabSpec for each tab
// Initialize a TabSpec for each tab and add it to the TabHost
spec = tabHost.newTabSpec("UrunTab")
.setIndicator("Ürün",res.getDrawable(R.drawable.product))
.setContent(new Intent(this, UrunTab.class));
tabHost.addTab(spec);
//Do the same for other tabs
spec = tabHost.newTabSpec("ArabaTab")
.setIndicator("Araba",res.getDrawable(R.drawable.car))
.setContent(new Intent(this, ArabaTab.class));
tabHost.addTab(spec);
//Do the same for other tabs
spec = tabHost.newTabSpec("GecmisTab")
.setIndicator("Geçmiş",res.getDrawable(R.drawable.history))
.setContent(new Intent(this, GecmisTab.class));
tabHost.addTab(spec);
//Do the same for other tabs
spec = tabHost.newTabSpec("HakkindaTab")
.setIndicator("Hakkında",res.getDrawable(R.drawable.about))
.setContent(new Intent(this, HakkindaTab.class));
tabHost.addTab(spec);
}
答案 0 :(得分:1)
不确定你是否找到了答案,但是我遇到了一个相关的问题,我试图让搜索界面显示在一个tabactivity菜单中(即搜索应该显示出来,无论哪个都是选项卡处于活动状态),并且没有显示。经过大量研究并仔细阅读'Search' article后,我注意到以下段落:
默认情况下,搜索对话框不是来自应用程序的每个活动。相反,只有当用户从应用程序的可搜索上下文中调用搜索时,才会向用户显示搜索对话框。可搜索的上下文是您已在清单文件中声明可搜索的元数据的任何活动。例如,可搜索的Activity本身(在上面的清单片段中声明)是一个可搜索的上下文,因为它包含定义可搜索配置的元数据。默认情况下,应用程序中的任何其他活动都不是可搜索的上下文,因此不会显示搜索对话框。但是,您可能希望从其他活动中获取搜索对话框(并在用户执行搜索时启动可搜索的活动)。你可以做到这一点。
您还可以控制哪些活动提供更细粒度的搜索。要仅将单个Activity指定为可搜索的上下文,请将“android.app.default_searchable”名称放在相应元素内(而不是在元素内)。虽然不常见,但您也可以创建多个可搜索的Activity,并在应用程序的不同上下文中提供每个Activity,方法是在每个元素中声明一个不同的可搜索Activity,或者为整个应用程序声明一个默认的可搜索Activity,然后覆盖它某些活动中的元素。 (如果要搜索不能由相同的可搜索活动处理的不同数据集,可以执行此操作,具体取决于当前打开的活动。)
简而言之,您必须拥有您要调用的特定活动的搜索元数据onSearchRequested()
。不仅如此,这些其他活动中的元数据应该具有default_searchable的名称并提及搜索活动,而不是xml可搜索文件,如下所示:
<meta-data android:name="android.app.default_searchable"
android:value=".SearchScreen" />
注意到两个地方的搜索元数据错误。