使用Fragment实现操作栏选项卡

6

最近我需要实现Action Bar选项卡,它可以用新的Fragment替换当前的Fragment。尽管我花费了数小时进行密集搜索,但我无法找到清晰的解决方案,因此我想在这里介绍一下我是如何解决这个问题。其中两个Fragment包含了列表视图,这证明是一个重要的复杂因素。

1个回答

15

首先创建一个你想要附加片段的 Activity。在该 Activity 的 XML 文件中添加一个线性布局,如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".WoodenSideProject" >
<LinearLayout
    android:id="@+id/fragment_placeholder"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
</LinearLayout>   

不要向XML文件中添加任何其他内容,甚至不要添加预加载在Eclipse中的选项卡宿主。

接下来创建你的片段。首先使用该片段的XML文件构建你想要的片段UI。我将展示如何创建一个带有列表视图的片段:

public class Fragment1Name extends Fragment
{
public static String TAG="DirectionsFragment";
private String[] list_items = {"Put the list of Strings you want here"};
ListView lView1;
/*@Override
public void onActivityCreated(Bundle savedInstanceState)
{
    super.onActivityCreated(savedInstanceState);
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
            android.R.layout.simple_list_item_1, list_items);
        setListAdapter(adapter);
}*/

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_XML_title, container, false);
    createListView(view);
    // Inflate the layout for this fragment
    return view;
}

private void createListView(View view)
{
    lView1 = (ListView) view.findViewById(R.id.ListViewID);
    //Set option as Multiple Choice. So that user can able to select more the one option from list
    lView1.setAdapter(new ArrayAdapter<String>(getActivity(),
    android.R.layout.simple_list_item_1, list_items));
}
}
有些人建议扩展ListFragment来创建一个使用列表视图的片段。我的经验是,这样做比它所值得的麻烦得多。
请按以下方式设置Activity的Java文件:
public class ActivityName extends FragmentActivity {
public static Context appContext;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_project);

ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
setTitle("WoodenSideProject");

ActionBar.Tab tab1 = actionBar.newTab().setText("Tab1");
ActionBar.Tab tab2 = actionBar.newTab().setText("Tab2");
ActionBar.Tab tab3 = actionBar.newTab().setText("Tab3");

Fragment Fragment1Name = new Fragment1Name();
Fragment Fragment2Name = new Fragment2Name();
Fragment Fragment3Name = new Fragment3Name();

tab1.setTabListener(new MyTabsListener(Fragment1Name));
tab2.setTabListener(new MyTabsListener(Fragment2Name));
tab3.setTabListener(new MyTabsListener(Fragment3Name));

actionBar.addTab(tab1);
actionBar.addTab(tab2);
actionBar.addTab(tab3);
}

在同一活动中创建以下类:

class MyTabsListener implements ActionBar.TabListener {
public Fragment fragment;

public MyTabsListener(Fragment fragment) {
    this.fragment = fragment;
}

@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
    //do what you want when tab is reselected, I do nothing
}

@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
    ft.replace(R.id.fragment_placeholder, fragment);
}

@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
    ft.remove(fragment);
}
}

我不知道其他人实现带有片段的操作栏选项卡是否遇到了与我同样的麻烦,但如果是的话,我希望这可以帮助到他们。非常欢迎提出更好的实现建议。


如果你遇到了这样的错误怎么办?AndroidRuntime(5485): java.lang.IllegalStateException: Failure saving state: active has cleared index: -1 - CaffeineShots
1
然后你会得到一个错误,应用程序将会关闭 =) - Waclock
这是一个比谷歌指南中提供的TabListener更好的实现。 - David

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接