zoukankan      html  css  js  c++  java
  • Android 利用ViewPager、Fragment、PagerTabStrip实现多页面滑动效果(转载)

    本文主要介绍如何利用ViewPager、Fragment、PagerTabStrip实现多页面滑动效果。即google play首页、新浪微博消息(at、评论、私信、广播)页面的效果。ViewPager+Fragment组合为google推荐方式,比TabActivity+Activity的效率高的多,示例工程即代码见ViewPager Demo

    1、添加android support包
    因为上面的几个类都是在android support包中才提供,我们先添加包。
    在Eclipse->Window->Android SDK Manager,选择列表中Extras->Android Support Library进行安装。下载完后在android-sdk\extras\android\support目录下,这里我们选择v4版本,进入v4目录,拷贝其中的android-support-v4.jar文件到工程的libs目录(若没有新建)下即可,编译时ADT会自动将其导入项目中。

    2、新建ViewPager的layout,内容如下

    复制代码
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
        
        <android.support.v4.view.ViewPager
            android:id="@+id/viewPager"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center" >
            <android.support.v4.view.PagerTabStrip    
                android:layout_width="wrap_content"    
                android:layout_height="wrap_content"    
                android:layout_gravity="top" />
        </android.support.v4.view.ViewPager>
    </LinearLayout>
    复制代码

    ViewPager用来管理layout并可以左右滑动显示各个页面数据,PagerTabStrip用来显示页面title,android:layout_gravity="top"表示title在顶部,可设置bottom等。

    3、新建FragmentActivity页面
    FragmentActivity页面含有ViewPager元素,可以用来显示Fragment,定义如下:

    FragmentActivity页面
    复制代码
    public class ViewPagerDemo extends FragmentActivity {
    
        /** 页面list **/
        List<Fragment> fragmentList = new ArrayList<Fragment>();
        /** 页面title list **/
        List<String>   titleList    = new ArrayList<String>();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.view_pager_demo);
    
            ViewPager vp = (ViewPager)findViewById(R.id.viewPager);
            fragmentList.add(new ViewPagerFragment1("页面1"));
            fragmentList.add(new ViewPagerFragment1("页面2"));
            fragmentList.add(new ViewPagerFragment1("页面3"));
            titleList.add("title 1 ");
            titleList.add("title 2 ");
            titleList.add("title 3 ");
            vp.setAdapter(new myPagerAdapter(getSupportFragmentManager(), fragmentList, titleList));
        }
    
        /**
         * 定义适配器
         * 
         * @author gxwu@lewatek.com 2012-11-15
         */
        class myPagerAdapter extends FragmentPagerAdapter {
    
            private List<Fragment> fragmentList;
            private List<String>   titleList;
    
            public myPagerAdapter(FragmentManager fm, List<Fragment> fragmentList, List<String> titleList){
                super(fm);
                this.fragmentList = fragmentList;
                this.titleList = titleList;
            }
    
            /**
             * 得到每个页面
             */
            @Override
            public Fragment getItem(int arg0) {
                return (fragmentList == null || fragmentList.size() == 0) ? null : fragmentList.get(arg0);
            }
    
            /**
             * 每个页面的title
             */
            @Override
            public CharSequence getPageTitle(int position) {
                return (titleList.size() > position) ? titleList.get(position) : "";
            }
    
            /**
             * 页面的总个数
             */
            @Override
            public int getCount() {
                return fragmentList == null ? 0 : fragmentList.size();
            }
        }
    }
    复制代码

    其中的myPagerAdapter集成自ragmentPagerAdapter,为ViewPager提供数据源。

    onCreate函数得到ViewPager实例并设置数据源,getSupportFragmentManager表示得到Fragment管理器。ViewPagerFragment1表示具体的页面,见下面介绍。

    4、新建Fragment页面
    Fragment页面即为左右滑动需要显示的页面,新建类集成Fragment,并重写onCreateView函数即可。onCreateView函数相当于Activity的onCreate函数。如下:

    复制代码
    public class ViewPagerFragment1 extends Fragment {
    
        private String   text;
        private TextView tv = null;
    
        public ViewPagerFragment1(String text){
            super();
            this.text = text;
        }
    
        /**
         * 覆盖此函数,先通过inflater inflate函数得到view最后返回
         */
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View v = inflater.inflate(R.layout.view_pager_fragment_demo1, container, false);
            tv = (TextView)v.findViewById(R.id.viewPagerText);
            tv.setText(text);
            return v;
        }
    }
    复制代码

    简单效果如下:

    参考:

    http://developer.android.com/reference/android/support/v4/app/FragmentPagerAdapter.html

    可以分为下面的几部分:

      • 使用支持库

      • 创建一个Fragment

      • 创建一个动态UI

      • 多个Fragment之间的通信

     

    1、使用支持库

    如果您的应用需要运行在3.0及以上的版本,可以忽略这部分内容。

    如果您的应用使用在3.0以下、1.6及以上的版本,需要使用支持库来构建。

    使用支持库的步骤:

    1. 使用SDK下的SDK Manager工具下载Android Support Package

       2. 在您的Android工程的顶级目录下创建一个libs目录

      3. 找到您的SDK下的/extras/android/support/v4/android-support-v4.jar,并且拷贝到您的项目的libs下,选中这个jar包 → 右键 → Build Path → Add to Build Path

      4.在您的项目的Manifest.xml文件的<manifest>标签下添加:

      <uses-sdkandroid:minSdkVersion="4"

        android:targetSdkVersion="8"/>

        其中targetSdkVersion是您的软件最小支持的版本

      5.如果您的项目支持3.0以下的版本,请导入如下的包:android.support.v4.*;

      在使用FragmentActivity请继承FragmentActivity而不是Activity。如果您的系统是3.0或以上版本,同样需要导入类似的包,但是可以使用普通的Activity。 

        

      2、创建一个Fragment

      Fragment支持在不同的Activity中使用并且可以处理自己的输入事件以及生命周期方法等。可以看做是一个子Activity

      创建一个Fragment

      创建一个Fragment和创建一个Activity很类似,继承Fragment类,重写生命周期方法,主要的不同之处就是需要重写一个onCreateView()方法来返回这个Fragment的布局。例子:

       

        

      Fragment的生命周期方法依赖于Activity的生命周期,例如一个ActivityonPause()的生命周期方法被调用的时候这个Activity中的所有的FragmentonPause()方法也将被调用。

       

      更多的内容请参照类Fragment

      使用XML添加FragmentActivity

      尽管Fragment可以被多个Activity重用,但是您也必须把Fragment关联到一个FragmentActivity上。可以使用XML布局文件的方式来实现这种关联。

      说明:上面的所说的FragmentActivity适用在API3.0以下的版本,3.0及以上的版本可以使用普通的Activity

      例子:

        

      上面使用fragment标签,android:name=””指定一个添加到xml中的Fragment。对于创建不同的屏幕尺寸布局的更多信息,请阅读支持不同的屏幕尺寸。

       

       

        

      当您添加一个片段一个活动布局定义的布局XML文件中的片段,你不能删除在运行时的片段。如果您打算在用户交互和交换片段,你必须添加的活性片段的活动时第一次启动。

       

      3、构建一个灵活的UI

       

      FragmentManager提供了对Activity运行时的Fragment的添加、删除、替换的操作。

       

      Activity运行期间你可以添加Fragment而不是在XML布局文件中进行定义。如果你打算在Activity中改变Fragment的生命过程。

       

      如果要执行添加、删除、修改的操作,你必须通过FragmentManager的对象获得一个FragmentTransaction对象,通过它的API来执行这些操作。

       

      添加一个Fragment到一个Activity,必须把这个Fragment添加到一个容器视图中。例子:

       

      Activity中你可以通过getFragmentManager()来获得Fragment对象,然后通过FragmentManager对象的beginFragmentTransaction()方法来获得FragmentTransaction对象。通过它的add()方法来添加一个Fragment到当前的Activity中。

      一个FragmentTransaction对象可以执行多个增删修的方法,如果你想把这些修改提交到Activity上,必须在最后调用一下这个对象的commit()方法。例子:

       

        

      由于不是定义在XML布局中的,所有可以转型删除和修改的操作。

      如果替换或者删除一个Fragment然后让用户可以导航到上一个Fragment,你必须在调用commit()方法之前调用addToBackStack()方法添加到回退栈。如果你把这个Fragment添加到了回退栈,在提交之后这个Fragment是会被Stop而不是Destroyed。如果用户导航到这个Fragment,这个Fragment会被Restart而不是重新创建。如果你没有把它添加到回退栈,则在删除或者替换的时候它将被Destroyed。例子:

        

      4、与其他Fragment的交互

      两个单独的Fragment之间是不应该进行通信的。应该使用他们所存在的Activity作为沟通的纽带。

      为了实现两个Fragment的交互,您可以在Fragment中定义一个接口,然后再这个接口中定义一个方法,在FragmentonAttach()方法中调用这个接口中的方法。然后让Activity实现这个方法来完成ActivityFragment之间的通信。例子:

      定义接口并调用方法:

       

        

      实现接口,在这个方法中可以进行与其他Fragment的数据的交互:

        

      可以通过FragmentManagerfindFragmentById()来查找一个Fragment

       

  • 相关阅读:
    PhpStorm Swoole 和 CI 代码自动补全
    python正则表达式匹配多行
    ES6 Template Strings(转)
    IntelliJ隐藏特定后缀文件
    网络游戏术语(转)
    mac查看当前调用tcp的进程并关闭指定进程
    袭击Mercurial SCM(HG)
    T 泛型转换
    UiAutomator源代码分析之UiAutomatorBridge框架
    ASP.NET MVC 入门8、ModelState与数据验证
  • 原文地址:https://www.cnblogs.com/crazywenza/p/2851269.html
Copyright © 2011-2022 走看看