我有一个TabActivity,它有两个标签。我在每个标签中加载了单独的活动(活动 A & B )。在标签1中加载的活动A包含某些控件和 ListView 。我使用 AsyncTask 从 ListView 的Web服务加载数据。当用户点击ListView项目时,我必须加载另一个活动,但新的活动 C 应该加载到同一个选定的标签中。
我在互联网上搜索,发现我可以使用 ActivityGroup ......但与此同时,我发现它已被弃用。所以建议使用android-support-v4兼容性 Frangment 。
我下载了 android-support-v4.jar 并查看了 FragmentTabs 示例,我知道如何在Android 2.1中使用Fragments ....所以我替换了两个活动,我在选项卡中显示了两个碎片
但现在我不知道如何处理以下情况:
ListView&当我运行以下代码时,其他控件不显示。
我必须调用AsyncTask ...它需要时间来获得&解析来自服务器的XML数据,之前调用Fragment的 onCreateView ...那么如何在调用 onCreateView 之后在片段中设置 ListView
点击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 {
....
....
....
}
你可以给我一些例子。 非常感谢您的帮助!
答案 0 :(得分:1)
我是Android开发的新手,但我遇到了一些转换为片段的问题,所以我会尽力帮助。
这个问题与我认为的第二个问题有关,所以我会忽略它,并希望答案2能够很好地解决它。
我遇到了类似的情况,我将使用AsyncTask的活动转换为片段。我不确定这是不是很好的做法,但我只是将原来在onCreate中的逻辑(在你的情况下,你的ListView和你的getFeeds()调用)移动到onCreateView方法中。
就片段遍历而言,我使用了一个基础FragmentActivity,它将第一个Fragment设置为FragmentActivitiy布局中的相应容器。如果您想加载另一个片段,我相信您将引用FragmentActivity的FragmentManager,启动一个新事务并添加一个新片段。 android developer website彻底解释了所有这些。
如果您想直接从开放片段启动新片段,那么您首先需要使用getActivity()引用主机FragmentActivity。例如:
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
希望这有帮助!
对其他人:我也是新来回答这里的问题,所以请告诉我是否应该更改我发布的未来回复。