4

我已经定义了一个带有三个选项卡的 HomeActivity,每个选项卡都是一个单独的活动。我使用了 android 开发人员站点中的示例。http://developer.android.com/resources/tutorials/views/hello-tabwidget.html

选项卡 B(第二个选项卡)的 UI 包含一个文本和按钮(名为搜索)。当用户单击搜索按钮时,它应该联系 REST Web 服务并将结果显示为列表。

为了做到这一点,在 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 中显示对话框并取消。但是加载没有出现。

4

2 回答 2

0

嘿巴拉,我要说的是:

1) 最好将 TAB B 扩展为 ListActivity 并由助手类完成搜索。这样你就可以让你的代码更加独立。

2)实施1),你会没事的。

3)您应该在开始请求时显示一个进度对话框,并在获得结果时停止它。我会实现一个广播接收器来实现这一点(如果你选择这样做,我可以帮助你)。

于 2011-05-04T15:07:29.623 回答
0

有两种方法可以实现这一目标。

每当您开始另一个活动(即搜索活动)时,就在此之前将您的搜索活动设置为您想要的选项卡。您可以通过获取 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 */
        }
    }
}

仅通过调用从您的 UI 线程执行此操作new DownloadImageTask().execute()

首先preExecute将被调用,然后doInBackground当您从服务器获取数据时,onPostExecute将被调用。

我希望这能解决你的问题。

于 2011-05-09T07:58:16.167 回答