【问题标题】:how to use asynctask in android-support-v4.jar Fragment?如何在 android-support-v4.jar 片段中使用 asynctask?
【发布时间】:2012-03-31 05:48:31
【问题描述】:

我有一个 TabActivity,它有两个标签。我在每个选项卡中加载单独的活动(活动 AB)。在选项卡 1 中加载的 Activity A 具有 一些控件 和一个 ListView。我使用 AsyncTask 从该 ListView 的 Web 服务加载数据。当用户单击 ListView 项目时,我必须加载另一个活动,但新的活动 C 应该加载到同一个选定的选项卡中。

我在互联网上搜索,发现我可以使用 ActivityGroup ...但同时,我发现它已被弃用。于是提出了使用android-support-v4兼容性片段..

我下载了 android-support-v4.jar 并查看了 FragmentTabs 示例,我知道了如何在 Android 2.1 中使用 Fragments....所以我用两个 Fragments

替换了我在标签中显示的两个 Activity

但现在我不知道如何处理以下情况:

  1. 当我运行以下代码时,ListView 和其他控件不显示。

  2. 我必须调用 AsyncTask ...从服务器获取和解析 XML 数据需要时间,而且 Fragment 的 onCreateView 更早被调用 ...所以我该如何设置 onCreateView 后片段中的strong>ListView?

  3. 单击 ListView 项目后,我将不得不在同一个 选项卡 中加载另一个片段 C ...我该如何实现?

我的片段代码如下:

public class UpdatesFragment extends Fragment implements IFeedReceiver {
ArrayList<Feed> _feeds;
Integer _currentPage = 1;
ListView _lvUpdates;
UserMessage _userMessage;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    getFeeds();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.updates, container, false);
    this._lvUpdates = (ListView)v.findViewById(R.id.listUpdates);

    return v;
}

private void getFeeds() {
    FeedsCollectorAsyncTask task = new FeedsCollectorAsyncTask(
            getActivity(), this._currentPage);
    task.execute();
}

//This method is called from AsyncTask upon receiving & parsing data. So i m trying to populate my ListView here
@Override
public void onFeedReceived(ArrayList<Feed> feeds) {
    FeedsAdapter adapter = new FeedsAdapter(getActivity(),
            R.layout.feed_list_item, this._feeds);

    this._lvUpdates.setAdapter(adapter);

    // Load detail on item click
    this._lvUpdates.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int index,
                long id) {

        }
    });
}

}

主选项卡活动 XML 如下。

<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="5dp">        
    <FrameLayout
        android:id="@android:id/tabcontent"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_weight="0"/>
    <FrameLayout
        android:id="@+android:id/realtabcontent"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>

    <TabWidget
        android:id="@android:id/tabs"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="-6dp"/>
</LinearLayout>

最后……

public class PlayMakerActivity extends FragmentActivity {
/** Called when the activity is first created. */
TabHost tabHost;
TabManager mTabManager;

@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 = (TabHost) findViewById(android.R.id.tabhost);
    tabHost.setup();

    mTabManager = new TabManager(this, tabHost, R.id.realtabcontent);

    mTabManager.addTab(tabHost.newTabSpec("Upudates").setIndicator("Updates"),
            UpdatesFragment.class, null);       
}
}

//also included the following AS It IS
public static class TabManager implements TabHost.OnTabChangeListener {
    ....
    ....
    ....
}

你可以给我举个例子。 非常感谢您的帮助!

【问题讨论】:

    标签: android android-asynctask android-fragments android-tabhost


    【解决方案1】:

    我是 android 开发的新手,但在转换为 Fragment 时遇到了一些问题,所以我会尽我所能提供帮助。

    1. 这个问题与我认为的第二个问题有关,所以我将忽略它,希望答案 2 能很好地解决它。

    2. 我遇到了类似的情况,我将使用 AsyncTask 的活动转换为片段。我不确定这是否是好的做法,但我只是将最初在 onCreate 中的逻辑(在您的情况下,您的 ListView 和您的 getFeeds() 调用)移动到 onCreateView 方法中。

    3. 就片段遍历而言,我使用了一个基本的 FragmentActivity,它将第一个 Fragment 设置到 FragmentActivitiy 布局中的适当容器中。如果你想加载另一个片段,我相信你会引用你的 FragmentActivity 的 FragmentManager,开始一个新的事务并添加一个新的片段。 android developer website 彻底解释了这一切。

    如果您想直接从打开的 Fragment 启动新的 Fragment,那么您需要先使用 getActivity() 引用宿主 FragmentActivity。例如:

    FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();

    希望这会有所帮助!

    致其他人:我也是在这里回答问题的新手,所以如果我应该对我发布的未来回复进行更改,请告诉我。

    【讨论】:

    • 非常感谢您的详细回答。我还有其他问题,但他们的解决方案之一包括你的建议。所以我会接受它作为答案..再次感谢
    • 没问题,很高兴我能以某种方式帮助小伙子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多