Android学习小Demo(17)关于ViewPager和Fragment的使用
很多时候,一个应用有多个功能点,分属于不同的类别,存在这样的需求,不同的布局展示不同的功能,那么Fragment和ViewPager就是一个很好的帮手了。
而Fragment是3.0以后才提供的一个功能,所以在3.x之前的,如果要用Fragment的话,就要用support v4包了。
在Eclipse中升级到最新版的ADT之后,会发现通过Wizard来创建的Android项目,都默认会用Fragment来作为处理事务的主要逻辑窗口,而Activity则不再干这事了,这可能是Android想要强推Fragment的使用了吧,尽量将不同业务逻辑的控制分散到不同的Fragment中,降低程序的耦合度。
今天的小Demo就是来展示如何应用Fragment和ViewPager来显示不同的分组展现,具体效果先看下图:
如图上所示:
1)在界面上有两个页面,一个是显示正在运行的应用程序,一个是显示正在运行的服务,它们是由两个Fragment来展示的。
2)在屏幕下面有两个按钮,通过这两个按钮,可以分别切换到不同的Fragment中去。
3)ViewPager在这里作为Fragment的容器,通过左右滑动,可以在不同的Fragment中切换。
接下来我们看看一些关键的实现:
主界面的布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.lms.kicker.KickerMainActivity" tools:ignore="MergeRootFrame" > <android.support.v4.view.ViewPager android:id="@+id/vpContainer" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:paddingBottom="@dimen/activity_horizontal_margin" android:paddingLeft="@dimen/activity_vertical_margin" android:paddingRight="@dimen/activity_vertical_margin" android:paddingTop="@dimen/activity_horizontal_margin" /> <RadioGroup android:id="@+id/rgTabButtons" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <RadioButton android:id="@+id/rbRunningApp" style="@style/MainTags" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:text="@string/tag_running_app" /> <RadioButton android:id="@+id/rbRunningService" style="@style/MainTags" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:text="@string/tag_running_service" /> </RadioGroup> </LinearLayout>1)上方是一个ViewPager
两个Fragment
FragmentPagerAdapter
class KickerFragmentAdapter extends FragmentPagerAdapter { private Context mContext; public KickerFragmentAdapter(FragmentManager fm, Context context) { super(fm); mContext = context; } @Override public Fragment getItem(int arg0) { return Fragment.instantiate(mContext, fragmetns[arg0]); } @Override public int getCount() { return fragmetns.length; } }
FragmentPagerAdapter的代码逻辑很简单,跟一般的BaseAdapter类似,它主要有三个方法必须实现:
KickerFragmentAdapter adpater = new KickerFragmentAdapter(getSupportFragmentManager(), this);
2)getItem方法
private String[] fragmetns = new String[] { RunningAppFragment.class.getName(), RunningServiceFragment.class.getName() };
3)getCount,返回Pager的个数。
OnPageChangeListener 和 OnCheckedChangeListener
private OnPageChangeListener onPageChangeListener = new OnPageChangeListener() { @Override public void onPageSelected(int arg0) { mCurrentFragment = arg0;((RadioButton) rgTabButtons.getChildAt(arg0)).setChecked(true); } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageScrollStateChanged(int arg0) { } }; private OnCheckedChangeListener onCheckedChangeListener = new OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { int checkedItem = 0; switch (checkedId) { case R.id.rbRunningApp: checkedItem = 0; break; case R.id.rbRunningService: checkedItem = 1; break; } vpContainer.setCurrentItem(checkedItem); mCurrentFragment = checkedItem; } };
自定义Listener
public interface OnRunningAppRefreshListener { public void onRunningAppRefreshed(); }
public class KickerMainActivity extends ActionBarActivity implements RunningAppFragment.OnRunningAppRefreshListener{
为了保证Activity有实现这个接口,我们可以在onAttach的时候,将Activity强制转化为这个接口对象,如下:
public void onAttach(Activity activity){ super.onAttach(activity); try{ onRunningAppRefreshListener = (OnRunningAppRefreshListener) activity; }catch(ClassCastException e){ throw new ClassCastException(activity.toString() + " must implement OnRunningAppRefreshListener"); } }
这样,如果Activity没有实现这个接口,就会抛出异常。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。