【问题标题】:Android - Tab Navigation <while Spanning a new activity>Android - 标签导航 <同时跨越一个新活动>
【发布时间】:2010-07-29 20:07:19
【问题描述】:
我定义了一个带有三个选项卡的 HomeActivity,每个选项卡都是一个单独的活动。我使用了 android 开发者网站中的示例。 http://developer.android.com/resources/tutorials/views/hello-tabwidget.html
选项卡 B(第二个选项卡)的 UI 包含一个文本和按钮(名为搜索)。当用户单击搜索按钮时,它应该联系 REST 网络服务并将结果显示为列表。
为了做到这一点,在 TAB B 活动中,单击按钮时,我调用了一个方法,该方法创建了一个意图并调用了一个新的 SearchResultsActivity(此后称为 SRA)。在 SRA 内部(扩展列表活动),我有连接到 Web 服务并解析返回的 JSON 结果的逻辑,该结果将结果显示为列表。我能够实现此功能。但我在这里看到了一些缺点,我的问题是:
是否可以定义一个新的活动 (SRA) 来处理搜索结果?还是让它在 TAB B 活动本身中处理会更好?我进行单独活动的主要原因是,SRA 扩展了 ListActivity,如果我想将它显示为 List 和 TabB 只是扩展 Activity 和不允许我显示结果。那么,有没有更好的方法来做到这一点?
鉴于上述实现,当我从 TabB(单击搜索按钮)导航到 SRA 时,不再看到选项卡。因为 TabB 正在调用新活动(
Intent srchIntent = new Intent(TabB.this, SearchResultActivity.class);
TabB.this.startActivity(srchIntent);),标签消失了。在这种情况下,最好的解决方案是什么,以便标签出现/结果显示在标签 B 中?
从 TabB 导航到 SRA 时,我试图在调用 StartActivity 之前显示在 TabB 中定义的进度对话框/加载,然后取消它。但是加载图标没有出现。我尝试显示对话框并取消在 SRA 中也是如此。但是加载没有出现。
【问题讨论】:
标签:
android
android-tabhost
【解决方案1】:
嘿巴拉,我要说的是:
1) 最好将 TAB B 扩展为 ListActivity 并由助手类完成搜索。这样你就可以让你的代码更加独立。
2) 实施 1),你会没事的。
3) 您应该在开始请求时显示一个进度对话框,并在获得结果时停止它。我会实现一个广播接收器来实现这一点(如果你选择这样做,我可以帮助你)。
【解决方案2】:
有两种方法可以实现这一目标..
每当您开始另一个活动(即搜索活动)时,就在此之前将您的搜索活动设置为您想要的标签。您可以通过获取 TabActivity 的实例(即扩展此类的活动)并调用 new Intent().setClass(TABACTIVITY_INSTANCE,ACTIVITY YOU_WANT_TO_SET_TO_THIS_TAB) 来实现此目的。但是让不同的意图对象成为成员类..不要做这样的事情(new Intent().setClass())。
将意图对象的数量声明为您持有的选项卡数量,然后使用setClass 方法。
(这将解决您的标签消失的问题)
现在要从服务器获取数据,我建议你实现AsyncTask(Android 上提供了很棒的 api):
private class DownloadImageTask extends AsyncTask<String, Void, String>
{
AbousUsHandler aboutHandeler;
@Override
protected void onPreExecute()
{
mProgress.setMessage("Please wait");
mProgress.show();
super.onPreExecute();
}
protected String doInBackground(String... urls)
{
/* Do you your background task i.e. getting data from server
but don't do ui related things here as this method is called in Thread
pool not on Android Ui thread.*/
return null;
}
protected void onPostExecute(String result)
{
try
{
mProgress.dismiss();
/* set Your List View Adapter here */
}
}
}
仅通过调用 new DownloadImageTask().execute() 从您的 UI 线程执行此操作。
首先调用preExecute,然后调用doInBackground,当您从服务器获取数据时,将调用onPostExecute。
我希望这能解决你的问题。