将一个片段替换为TabHost中的另一个片段

时间:2013-06-15 09:12:03

标签: android android-fragments android-tabhost fragment-tab-host

我正在创建一个包含每个片段的五个标签。 我在第一个选项卡和ListView OnItemClickListener中使用ListView我想从第一个Tab片段替换为第二个选项卡Fragment。 如何使用FragmentTabHost来实现这一目标? 我为主类和所有片段类扩展Fragment。我不是FragmentActivity。那么如何将标签从一个片段更改为另一个片段?

MainClass:

public class TabsFragment extends Fragment implements OnTabChangeListener {

    private View mRoot;
    public TabHost mTabHost;
    private int mCurrentTab;

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        mRoot = inflater.inflate(R.layout.tabs_fragment, null);
        mTabHost = (TabHost) mRoot.findViewById(android.R.id.tabhost);
        setupTabs();
        return mRoot;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        setRetainInstance(true);

        mTabHost.setOnTabChangedListener(this);
        mTabHost.setCurrentTab(mCurrentTab);
        // manually start loading stuff in the first tab
        updateTab("1");
    }

    private void setupTabs() {
        mTabHost.setup(); // important!
        mTabHost.addTab(newTab("1", R.drawable.fragment1, R.id.fragment1));
        mTabHost.addTab(newTab("2", R.drawable.fragment2, R.id.fragment2));
        mTabHost.addTab(newTab("3", R.drawable.fragment3, R.id.fragment3));
        mTabHost.addTab(newTab("4", R.drawable.fragment4, R.id.fragment4));
        mTabHost.addTab(newTab("5", R.drawable.fragment5, R.id.fragment5));
    }

    private TabSpec newTab(String tag, int labelId, int tabContentId) {
        Log.d(TAG, "buildTab(): tag=" + tag);

        View indicator = LayoutInflater.from(getActivity()).inflate(
                R.layout.tab,
                (ViewGroup) mRoot.findViewById(android.R.id.tabs), false);
        ((ImageView) indicator.findViewById(R.id.imageView1)).setImageResource(labelId);
        TabSpec tabSpec = mTabHost.newTabSpec(tag);
        tabSpec.setIndicator(indicator);
        tabSpec.setContent(tabContentId);
        return tabSpec;
    }

    @Override
    public void onTabChanged(String tabId) {
        updateTab(tabId);
        mCurrentTab = Integer.valueOf(tabId) - 1;
    }

    private void updateTab(String tabId) {
        FragmentManager fm = getFragmentManager();

        if (fm.findFragmentByTag(tabId) == null) {
            if (tabId.equals("1"))
                 fm.beginTransaction().replace(R.id.fragment1, new Fragment1(), tabId).commit();
            else if (tabId.equals("2"))
                fm.beginTransaction().replace(R.id.fragment2, new Fragment2(), tabId).commit();
            else if (tabId.equals("3"))
                fm.beginTransaction().replace(R.id.fragment3, new Fragment3(), tabId).commit();
            else if (tabId.equals("4"))
                fm.beginTransaction().replace(R.id.fragment4, new Fragment4(), tabId).commit();
            else if (tabId.equals("5"))
                fm.beginTransaction().replace(R.id.fragment5, new Fragment5(), tabId).commit();
        }
    }
}

片段1:

public class Fragment1 extends Fragment implements  OnItemClickListener {
    ListView listView;
    View theView;

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        theView = inflater.inflate(R.layout.fragment1, container, false);
        listView = (ListView)theView.findViewById(R.id.list);
        listView.setOnItemClickListener(this);
        return theView;

    }

    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

        // Here I want to switch from 1st Tab(Fragment1) to 2nd Tab(Fragment2)
        // How can I switch from 1st tab to 2nd tab here???
        // Below code is not worked for me.

        Fragment2 newFragment = new Fragment2();
        FragmentTransaction transaction = getFragmentManager().beginTransaction();
        transaction.replace(R.id.map, newFragment);
        transaction.commit();
    }
}

Fragment2:

public class Fragment2 extends SupportMapFragment {
    private LatLng mPosFija = new LatLng(37.878901,-4.779396);
    GoogleMap mapView;
    public Fragment2() {
        super();
    }

    public static Fragment2 newInstance(LatLng posicion) {
        Fragment2 frag = new Fragment2();
        frag.mPosFija = posicion;
        return frag;
    }
    @Override
    public void onResume() {
      super.onResume();
      initMap();
    }

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

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = super.onCreateView(inflater, container, savedInstanceState);
        view = inflater.inflate(R.layout.fragment2, container, false);
        view.setId(getId());
        SupportMapFragment fm = (SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.mapview);
        mapView = fm.getMap();
        initMap();
        return view;
    }

    private void initMap() {
        UiSettings settings = mapView.getUiSettings();
        settings.setAllGesturesEnabled(true);
        settings.setMyLocationButtonEnabled(true);
        mapView.addMarker(new MarkerOptions().position(mPosFija).icon(BitmapDescriptorFactory.fromResource(R.drawable.icon)));
    }
}

2 个答案:

答案 0 :(得分:2)

查看我的帖子。这包含了您需要的所有基本功能。

Dynamically changing the fragments inside a fragment tab host?

答案 1 :(得分:-1)

NextFragment nextFrag = new NextFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.addToBackStack("next");
//container_framelayout: FrameLayout of Fragment to be replaced
transaction.replace(R.id.container_framelayout, nextFrag);
transaction.commit();