Viewpager和Fragement实现翻页

来源:互联网 发布:菠菜代源码论坛 编辑:程序博客网 时间:2024/05/29 08:14

新建类,继承fragement,在里面重写oncreateview(),里面返回要呈现的view视图。

public class FragementFirst extends Fragment implements OnClickListener {private Button btn;private TextView tv;private View view;@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// TODO Auto-generated method stubview = inflater.inflate(R.layout.fragement_first, container, false);init();return view;}public void init() {btn = (Button) view.findViewById(R.id.button1);tv = (TextView) view.findViewById(R.id.textView1);btn.setOnClickListener(this);}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubif (v == btn) {tv.setText("click");}}}

如果要添加事件,就实现onclick接口,跟活动的操作差不多。

活动类:

public class MainActivity extends FragmentActivity {private ViewPager viewpager;private FramPagerAdap pageradapter;private FragementFirst framfirst;private FragementSecond framsecond;private FragementThird framthird;// 页面列表private List framlist = new ArrayList();// 标题列表private List<String> titlelist = new ArrayList<String>();// 设置标题的属性private PagerTitleStrip pagestrip;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.acy_main);init();}public void init() {viewpager = (ViewPager) findViewById(R.id.viewpager);// 加入页面framfirst = new FragementFirst();framsecond = new FragementSecond();framthird = new FragementThird();framlist.add(framfirst);framlist.add(framsecond);framlist.add(framthird);// 加入标题titlelist.add("第一页");titlelist.add("第二页");titlelist.add("第二页");pageradapter = new FramPagerAdap(getSupportFragmentManager(), framlist,titlelist);viewpager.setAdapter(pageradapter);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}}

在活动中,将fragement加载进入。

 适配器:

public class FramPagerAdap extends FragmentPagerAdapter{private List<Fragment> framlist;private List<String> titlelist;public FramPagerAdap(FragmentManager fm, List<Fragment> framlist,List<String> titlelist) {super(fm);// TODO Auto-generated constructor stubthis.framlist = framlist;this.titlelist = titlelist;}@Overridepublic Fragment getItem(int item) {// TODO Auto-generated method stubreturn framlist.get(item);}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn framlist.size();}@Overridepublic CharSequence getPageTitle(int position) {// TODO Auto-generated method stubreturn titlelist.get(position);}}

活动的xml:

<RelativeLayout 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.support.v4.view.ViewPager        android:id="@+id/viewpager"        android:layout_width="wrap_content"        android:layout_height="wrap_content" >        <android.support.v4.view.PagerTitleStrip            android:id="@+id/pagertitle"            android:layout_width="wrap_content"            android:layout_height="wrap_content" />    </android.support.v4.view.ViewPager></RelativeLayout>

fragement xml:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent" >    <Button        android:id="@+id/button1"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="Button" />    <TextView        android:id="@+id/textView1"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginTop="50dp"        android:text="TextView1" /></RelativeLayout>

注意:

1.跳转到其他活动:使用getactivity 来获得当前活动的实例。

在fragement中调用实例:

@Overridepublic void onClick(View v) {// TODO Auto-generated method stubIntent intent;if (v == btn) {//跳转到登录界面intent = new Intent(getActivity(), LoginActivity.class);startActivity(intent);}}

注意:

1.监听滑动到每页,监听应该对viewpager监听,而不是适配器,否则不起作用。

viewPager.setOnPageChangeListener(new OnPageChangeListener() {// 当选中某一页@Overridepublic void onPageSelected(int position) {// TODO Auto-generated method stubLog.e("***", ";" + position);}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {// TODO Auto-generated method stub}@Overridepublic void onPageScrollStateChanged(int arg0) {// TODO Auto-generated method stub}});

2.当有时候,可能会发生Fragment错位的现象,这是因为在每次滑动时,getItem()中都是相同的碎片的时候,会进行替换。我们来看下FragmentPagerAdapter源码中实例化方法:

@Overridepublic Object instantiateItem(ViewGroup container, int position) {if (mCurTransaction == null) {//FragmentTransaction 对象初始化mCurTransaction = mFragmentManager.beginTransaction();}final long itemId = getItemId(position);// Do we already have this fragment?String name = makeFragmentName(container.getId(), itemId);Fragment fragment = mFragmentManager.findFragmentByTag(name);//当找到相同id的碎片 attack()重新粘上碎片.否则,将新的碎片加载进去。if (fragment != null) {if (DEBUG)Log.v(TAG, "Attaching item #" + itemId + ": f=" + fragment);mCurTransaction.attach(fragment);} else {fragment = getItem(position);if (DEBUG)Log.v(TAG, "Adding item #" + itemId + ": f=" + fragment);mCurTransaction.add(container.getId(), fragment,makeFragmentName(container.getId(), itemId));}if (fragment != mCurrentPrimaryItem) {fragment.setMenuVisibility(false);fragment.setUserVisibleHint(false);}return fragment;}

当你同时沾上两片一样的碎片的时候。有可能会导致错位,当然也有可能不会(就是相互覆盖得很好)。

我们为了避免这种情况,在getItem()中,添加处理就可以了。

//当碎片页以前没加载进去过if (null == fManager.findFragmentById(position)) {return fragment;}return fManager.findFragmentById(position);




0 0
原创粉丝点击