安卓“Fragment”, 再简单的知识也不能小视
        最近应用系统实习在弄一个安卓项目,具体项目就不说了。只是有一点感触很深,那就是再简单的知识,时间长不用也就生疏了,虽然捡起来也是分分钟的事情。要避免生疏,只有多用,多温习以前学的东西。借此温习一下安卓开发的基本知识点,最近估计会有几篇类似的笔记,那话咋说来着,对,温故而知新。。。

本篇笔记回顾一下安卓开发的基本知识之一——Fragment


Fragment是为了适应不同屏幕大小而推出的,Fragment使用很灵活,它有自己的生命周期,而且使用开销很小。你可以自由地移除、替换或者添加某个Fragment。Fragment是依赖于Activity存在的,以下是Activity与Fragment的生命周期的关系:
文章正文图片


        至于使用,自然是很简单的,你可以用上IDE为你自动创建的模板, 当然,只是个模板,仅供参考。大多数情况下都需要自己写的。
        下面就来建立一个简单的Fragment工程。创建一个空的Activity工程之后,首先将主布局更改为FrameLayout,为方便代码找到根布局,先为根布局添加一个ID,此例中就用container。
        然后就是布局文件的创建,此处建立了两个布局文件: fragment_one 和 fragment_two;

fragment_one:

< xml version="1.0" encoding="utf-8" >
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:weightSum="1"
    android:background="#ccfff6">

    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="100dp"
        android:text="我是Fragment_1"
        android:gravity="center"
        android:textSize="18sp" />

    <Button
        android:id="@+id/btn_openFrag"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAllCaps="false"
        android:layout_gravity="center"
        android:text="打开新Fragment" />
</LinearLayout>

fragment_two:

< xml version="1.0" encoding="utf-8" >
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:weightSum="1"
    android:background="#e8c9ff">

    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="100dp"
        android:text="我是Fragment_2"
        android:gravity="center"
        android:textSize="18sp" />
</LinearLayout>
        分别新建两个类,继承自Fragment(android.support.v4.app.Fragment), 用android.app.Fragment也行,只是加载需要将获取Fragment的方法换一下,两者是兼容性区别,v4下的可以兼容到1.6, app下的安卓3.0及以后才能用,当然,现在可以忽略这个问题,毕竟安卓4.0之前的设备。。。。。。。support.v4的Fragment对应getSupportFragmentManager()android.app下的Fragment对应getFragmentManager()需要特别说明的一点,在一个fragment中启动另一个fragment,无论用哪个包下的Fragment,获取管理对象都用方法getFragmentManager, 因为上一级已经获取了正确的FragmentManager。

第一个类: Fragment_one:

public class Fragment_one extends Fragment {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View root = inflater.inflate(R.layout.fragment_one, container, false);

        //设置一个透明度动画
        AlphaAnimation anim = new AlphaAnimation(0, 1);
        anim.setDuration(500);
        root.startAnimation(anim);

        Button btn_openFrag = (Button) root.findViewById(R.id.btn_openFrag);
        btn_openFrag.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getFragmentManager()        //虽然此处启动的是support.v4下面的Fragment,但此处的方法区别于MainActivity里面的方法,此处是获取当前的管理对象,所以直接用该方法
                        .beginTransaction()
                        .replace(R.id.container, new Fragment_two())
                        .commit();
            }
        });

        return root;
    }
}

第二个类: Fragment_two

public class Fragment_two extends Fragment {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View root = inflater.inflate(R.layout.fragment_two, container, false);

        //设置一个透明度动画
        AlphaAnimation anim = new AlphaAnimation(0, 1);
        anim.setDuration(500);
        root.startAnimation(anim);

        return root;
    }
}

接下来是MainActivity:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if(savedInstanceState == null){
            getSupportFragmentManager()    //可以看到获取FragmentManager只在此处有区别,也就是最顶层的Fragment
                    .beginTransaction()
                    .add(R.id.container, new Fragment_one())
                    .commit();
        }
    }
}

之后效果如下:

文章正文图片


        注意到一个细节,打开第二个fragment后,点击后退键程序直接退出了,这显然是不是我们想要的效果,所以在启动第二个Fragment时,需要将第一个Fragment加入到后退栈,只需在replace之前加上“.addToBackStack(null)”即可,也比较好理解,修改参考如下:
public class Fragment_one extends Fragment {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View root = inflater.inflate(R.layout.fragment_one, container, false);

        //设置一个透明度动画
        AlphaAnimation anim = new AlphaAnimation(0, 1);
        anim.setDuration(500);
        root.startAnimation(anim);

        Button btn_openFrag = (Button) root.findViewById(R.id.btn_openFrag);
        btn_openFrag.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getFragmentManager()        
                        .beginTransaction()
                        .addToBackStack(null)     //添加此句
                        .replace(R.id.container, new Fragment_two())
                        .commit();
            }
        });

        return root;
    }
}

修改后效果如下

文章正文图片


        至此,简单的Fragment演示就完成了, 当然,这只是简单的演示,Fragment比这强大多了,可以添加到多种布局,灵活设计。至于add eplace方法也很直观,就不赘述了。
        网上有不少人发表过言论说抛弃Fragment,各有各的说法,但是学习一下还是有必要的。
It's
欢迎访问本站,欢迎留言、分享、点赞。愿您阅读愉快!
*转载请注明出处,严禁非法转载。
https://www.devsong.org
QQ留言 邮箱留言
头像
引用:
取消回复
提交
涂鸦
涂鸦
热门