根据操作栏选项卡更改活动内容视图

时间:2011-12-01 16:46:50

标签: android android-activity tabs android-fragments

我想知道是否可以这样做。基本上我有一个包含2个片段的布局,我用于大多数选项卡但在2个选项卡上我想添加几个片段来显示更多内容。更改标签时是否可以将内容视图更改为其他布局?

如果不能这样做,我想到创建一个包含我需要的所有片段部分的布局,只是改变片段的布局,以便我不使用的那些不会“显示”。我不是指使用FragmentTransaction.hide()因为我希望片段在不使用其他片段时填满屏幕。这是一个坏主意还是有更简单的方法来做我想要的事情?

这是我的活动代码和标签

public class Tabs extends Activity{
long deleteID;

@Override
public void onCreate(Bundle create){
    super.onCreate(create);

    setContentView(R.layout.main_layout);

    createTabs();
    ActionBar bar = getActionBar();
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);
    bar.setDisplayHomeAsUpEnabled(true);

    if(create != null){
        bar.setSelectedNavigationItem(create.getInt("Home",0));
    }

}

我还添加了标签,但这并不重要

这是actionbar子类

private class TabListener implements ActionBar.TabListener{
    TabContent mFragment;

    public TabListener(TabContent fragment) {
        mFragment = fragment;
    }

    @Override
    public void onTabReselected(Tab tab, android.app.FragmentTransaction ft) {

    }

    @Override
    public void onTabSelected(Tab tab, android.app.FragmentTransaction ft) {

            ListFragment newListFragment = new BowlersListFragment();
            Fragment newFragment = new BowlerEntryFrag();
            ft = getFragmentManager().beginTransaction();
            ft.replace(R.id.frameOne, newListFragment);
            ft.replace(R.id.frameTwo, newFragment);

        ft.addToBackStack(null);
        ft.commit();
    }

    @Override
    public void onTabUnselected(Tab tab, android.app.FragmentTransaction ft) {

        if(ft != null){
            ft.remove(mFragment);
        }
    }

}

}

我尝试过Activity.setContentView(r.layout.newView),但这不起作用

1 个答案:

答案 0 :(得分:1)

我有类似的问题,所以这样实现了。我有一个mainActivity,用于保存和创建选项卡。该活动使用带有一个片段容器的布局main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center"
android:orientation="vertical" >

<LinearLayout
    android:id="@+id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

</RelativeLayout>

在我的活动中,我有以下用于创建标签和片段的代码:

historyTab = actionbar.newTab().setText("History");
historyTab.setTabListener(new MyTabsListener(new HistoryFragment()));
actionbar.addTab(historyTab);

我的tabListener看起来像这样:

    private class MyTabsListener implements ActionBar.TabListener {
    public Fragment fragment;
    private boolean isFragmentAdded = false;

    public MyTabsListener(Fragment fragment) {
        this.fragment = fragment;
    }
           @Override
    public void onTabSelected(Tab tab, android.app.FragmentTransaction ft) {

        FragmentManager fragMgr = getSupportFragmentManager();
        FragmentTransaction xaction = fragMgr.beginTransaction();

        if (fragment instanceof HistoryFragment) {
            fragment = new HistoryFragment();
            xaction.add(R.id.fragment_container, fragment);
        } else if (fragment instanceof .. some other fragment..) {
            fragment = new .. some other fragment();
            xaction.add(R.id.fragment_container, fragment);
        } 
        }

        xaction.commit();
    }

    @Override
    public void onTabUnselected(Tab tab, android.app.FragmentTransaction ft) {

        FragmentManager fragMgr = getSupportFragmentManager();
        FragmentTransaction xaction;

        xaction = fragMgr.beginTransaction();
        Fragment fragment = fragMgr.findFragmentById(R.id.fragment_container);
        xaction.remove(fragment);

        xaction.commit();
    }

}

我的示例中的History片段的布局可以是任何内容,甚至包含两个片段的布局,或者您需要的布局。请注意,在片段中的onCreateview方法中,使用:

    @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle          
savedInstanceState) {
    if (view == null) { // this line is very important!
        view = inflater.inflate(R.layout.history_fragment_layout, container, false);
        listView = (ListView) view.findViewById(R.id.historyList);
    }

    return view;
}

希望有所帮助!:)