使用片段实现操作栏选项卡

时间:2013-04-12 14:34:04

标签: android android-fragments android-actionbar

所以最近我需要实现操作栏选项卡,用新的片段替换当前片段。尽管进行了数小时的密集搜索,我仍无法找到明确的解决方案,所以我想我会在这里介绍我是如何解决这个问题的。其中两个片段包含列表视图,这是一个主要的复杂因素。

1 个答案:

答案 0 :(得分:15)

首先创建要附加片段的活动。在该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的tab主机。

接下来创建你的片段。首先使用片段的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);
}

在同一个Activity中创建以下类:

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);
}
}

我不知道其他人是否遇到了与使用片段实现操作栏标签时一样多的麻烦,但如果他们是,我希望这会有所帮助。任何有关更好实施的建议都将不胜感激。