与选项卡和Viewpager的Android碎片

在这里输入图像说明

我们正在构build一个如上所示的嵌套有碎片的应用程序。

  1. 选项卡具有 – 详细信息选项卡和MAps选项卡
  2. 详细信息选项卡将有一个幻灯片 – 像查看页面滑块和下面的信息将滚动。
  3. 地图选项卡将显示地图。

在这里输入图像说明

我已经实现了标签和地图以及滑块,如上所示。 现在我很困惑如何添加滑块下面的内容,这将使详细信息选项卡滚动。

我试过了什么?

在CLick的Details选项卡上,Fragment将会尝试膨胀里面的两个Fragment布局。

AndroidTabLayoutActivity.java

package com.mink7.abs; import com.viewpagerindicator.CirclePageIndicator; import android.app.TabActivity; import android.content.Intent; import android.os.Bundle; import android.support.v4.view.ViewPager; import android.widget.TabHost; import android.widget.TabHost.TabSpec; import java.util.Random; import android.support.v4.app.FragmentTabHost; import com.viewpagerindicator.PageIndicator; import android.support.v4.app.FragmentActivity; import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; public class AndroidTabLayoutActivity extends TabActivity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // FragmentTabHost tabHost; setContentView(R.layout.main); // tabHost = (FragmentTabHost) findViewById(R.id.tabMode); TabHost tabHost = getTabHost(); /* * mAdapter = new TestFragmentAdapter(getSupportFragmentManager()); * * mPager = (ViewPager) findViewById(R.id.pager); * mPager.setAdapter(mAdapter); * * mIndicator = (CirclePageIndicator) findViewById(R.id.indicator); * mIndicator.setViewPager(mPager); */ // Tab for Photos TabSpec photospec = tabHost.newTabSpec("Details"); photospec.setIndicator("Details", getResources().getDrawable(R.drawable.icon_photos_tab)); Intent photosIntent = new Intent(this, DetailsActivity.class); photospec.setContent(photosIntent); // Tab for Songs TabSpec songspec = tabHost.newTabSpec("Maps"); // setting Title and Icon for the Tab songspec.setIndicator("Maps", getResources().getDrawable(R.drawable.icon_songs_tab)); Intent songsIntent = new Intent(this, MapsActivity.class); songspec.setContent(songsIntent); // Tab for Videos /* * TabSpec videospec = tabHost.newTabSpec("Videos"); * videospec.setIndicator("Videos", * getResources().getDrawable(R.drawable.icon_videos_tab)); Intent * videosIntent = new Intent(this, VideosActivity.class); * videospec.setContent(videosIntent); */ // Adding all TabSpec to TabHost tabHost.addTab(photospec); // Adding photos tab tabHost.addTab(songspec); // Adding songs tab // tabHost.addTab(videospec); // Adding videos tab } } 

DetailsActivity.java

 package com.mink7.abs; import android.os.Bundle; import android.support.v4.view.ViewPager; import com.viewpagerindicator.CirclePageIndicator; public class DetailsActivity extends BaseSampleActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.place_details_layout); mAdapter = new TestFragmentAdapter(getSupportFragmentManager()); mPager = (ViewPager)findViewById(R.id.pager); mPager.setAdapter(mAdapter); mIndicator = (CirclePageIndicator)findViewById(R.id.indicator); mIndicator.setViewPager(mPager); } } 

BaseSampleActivity.java

 package com.mink7.abs; import java.util.Random; import com.viewpagerindicator.PageIndicator; import android.support.v4.app.FragmentActivity; import android.support.v4.view.ViewPager; import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; public abstract class BaseSampleActivity extends FragmentActivity { private static final Random RANDOM = new Random(); TestFragmentAdapter mAdapter; ViewPager mPager; PageIndicator mIndicator; //FragmentTabHost mTabHost; @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.random: final int page = RANDOM.nextInt(mAdapter.getCount()); Toast.makeText(this, "Changing to page " + page, Toast.LENGTH_SHORT); mPager.setCurrentItem(page); return true; case R.id.add_page: if (mAdapter.getCount() < 10) { mAdapter.setCount(mAdapter.getCount() + 1); mIndicator.notifyDataSetChanged(); } return true; case R.id.remove_page: if (mAdapter.getCount() > 1) { mAdapter.setCount(mAdapter.getCount() - 1); mIndicator.notifyDataSetChanged(); } return true; } return super.onOptionsItemSelected(item); } } 

Solutions Collecting From Web of "与选项卡和Viewpager的Android碎片"

请注意,自从Android 4.2或最新的兼容性库支持碎片嵌套。 以前它根本不被支持。 至于下面的内容 – 只是把它们放在一个容器中

*我已经使用嵌套的Fragments(4.2)成功实现了一个类似的项目。

对于嵌套的片段,不要使用getSupportFragmentManager(),而要使用getChildFragmentManager()。

例如要在tabFragment中使用viewpagerFragment,示例代码是:

 public class TabFragment extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { .. .. .. mTabHost.setup(this.getActivity().getApplicationContext(), getSupportFragmentManager(),R.layout.*); mTabHost.setOnTabChangedListener(tabChangeListener); mTabHost.addTab(mTabHost.newTabSpec("label").setIndicator("tag"), ViewPagerFragment.class, arg); } public class ViewPagerFragment extends Fragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(.......); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { mViewPager = (ViewPager) view.findViewById(R.id.viewPager); mViewPager.setAdapter(new MyAdapter(getChildFragmentManager())); } public class MyAdapter extends FragmentPagerAdapter { public MyAdapter(FragmentManager fm) { super(fm); } @Override public int getCount() { return size; } @Override public Fragment getItem(int position) { } @Override public CharSequence getPageTitle(int position) { } }* 

我使用holoeverywhere这样做,但应该工作类似于ABS,或“本地”

 public class FragmentTestTabs extends Fragment implements ActionBar.TabListener, OnPageChangeListener { private ViewPager mViewPager; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getSupportActivity().getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); getSupportActivity().getSupportActionBar().addTab( getSupportActivity().getSupportActionBar().newTab().setText(getString(R.string.firtsRow)) .setTabListener(this)); getSupportActivity().getSupportActionBar().addTab( getSupportActivity().getSupportActionBar().newTab().setText(getString(R.string.secondRow)) .setTabListener(this)); } @Override public void onDestroyView() { super.onDestroyView(); getSupportActivity().getSupportActionBar().removeAllTabs(); getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); } @Override public void onPause() { super.onPause(); } @Override public void onResume() { super.onResume(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_view_pager); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { mViewPager = (ViewPager) view.findViewById(R.id.pager); MyAdapter adapter = new MyAdapter(getChildFragmentManager()); adapter.addFragment(new FragmentDiets()); adapter.addFragment(new FragmentCurrentDiet()); mViewPager.setOnPageChangeListener(this); mViewPager.setAdapter(adapter); mViewPager.setCurrentItem(0); } public class MyAdapter extends FragmentPagerAdapter { private final ArrayList<Fragment> mFragments = new ArrayList<Fragment>(); public MyAdapter(FragmentManager fm) { super(fm); } @Override public int getCount() { return mFragments.size(); } public void addFragment(Fragment fragment) { mFragments.add(fragment); notifyDataSetChanged(); } @Override public Fragment getItem(int position) { return mFragments.get(position); } } @Override public void onTabSelected(Tab tab, FragmentTransaction ft) { if(mViewPager!=null) mViewPager.setCurrentItem(tab.getPosition()); } @Override public void onTabUnselected(Tab tab, FragmentTransaction ft) { // TODO Auto-generated method stub } @Override public void onTabReselected(Tab tab, FragmentTransaction ft) { // TODO Auto-generated method stub } @Override public void onPageScrollStateChanged(int arg0) { // TODO Auto-generated method stub } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { // TODO Auto-generated method stub } @Override public void onPageSelected(int position) { getSupportActivity().getSupportActionBar().setSelectedNavigationItem(position); } 

而fragment_view_pager只是一个viewpager视图:

 <?xml version="1.0" encoding="utf-8"?> <android.support.v4.view.ViewPager android:id="@+id/pager" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > </android.support.v4.view.ViewPager>