7

我正在创建一个五个选项卡,每个选项卡都包含一个片段。我在第一个选项卡和 ListView 中使用 ListView,OnItemClickListener我想将第一个选项卡片段替换为第二个选项卡片段。我如何使用Fragmentand来做到这一点TabHost?我扩展Fragment了主类和所有片段类。我不是扩展FragmentActivity。那么如何将选项卡从一个片段更改为另一个片段?

主类:

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

片段2:

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

2 回答 2

2

看看我的帖子。这包含您需要的所有基本内容。

动态更改片段选项卡主机内的片段?

于 2013-11-19T05:46:23.203 回答
-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();
于 2015-06-19T21:42:53.747 回答