[学习笔记]用户界面优化之Android Fragment

来源:互联网 发布:股票医生软件下载 编辑:程序博客网 时间:2024/06/05 15:05

以下内容纯粹为本人学习笔记【记录】之用,所听课程(Q群群友百度网盘提供)为极客学院一位老师所讲(老师大名我尚未知晓),如有侵权请告知。在此特别感谢这位老师录制的视频资料。
用户界面优化 UIO User Interface Optimizing
Fragment n.碎片、片段;v.碎裂、破裂、分裂
Refactor v.重构
Android Fragment
1、使用Fragment
为什么要使用Fragment?一个应用程序,大部分都会使用到界面切换功能,同一个应用程序的内部做界面切换的话,(之前使用Activity进行切换)使用Activity不合适了(原因:Activity是一个比较重量级的基本组件,用在内部切换,有点儿杀鸡用牛刀),更好的替代方式即是Fragment莫属了,优点:轻量级、灵活。
实例:在FragmentMain添加一个按钮,点击,进入第二个界面FragmentB,如何操作?
1)添加按钮
2)第二个布局文件xml和对应的类
3)添加界面跳转的监听代码

MainActivity.java

package com.keen.learnfragment;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        if (savedInstanceState == null) {            //呈现Fragment的操作方式的4个步骤:获取;开始变化;添加新的Fragment(第1个参数是主容器);提交            getSupportFragmentManager().beginTransaction()                    .add(R.id.activity_main, new PlaceholderFragment())                    .commit();        }    }}

对应activity_main.xml默认就好。
PlaceholderFragment.java

package com.keen.learnfragment;import android.support.v4.app.Fragment;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;public class MainFragment extends Fragment {    //这个类需要继承自android.support.v4.app.Fragment    public MainFragment() {        // Required empty public constructor    }    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container,                             Bundle savedInstanceState) {        View rootView = inflater.inflate(R.layout.fragment_main, container, false);        //按钮(点击进入FragmentB的)事件监听器        rootView.findViewById(R.id.btnShowFragmentB).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                 getFragmentManager().beginTransaction()                         .addToBackStack(null)                         .replace(R.id.activity_main, new Fragment_b())                         .commit();                //addToBackStack()支持按返回退到当前界面(Fragment)            }        });        return rootView;    }}

注:这里无须像自动创建Fragment方式一样,用PlaceholderFragment

fragment_main.xml添加一个按钮用于点击就跳转到fragment_b

    <Button        android:id="@+id/btnShowFragmentB"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="这是FragmentMain,按钮为呈现Fragment B"/>

Fragment_b.java

package com.keen.learnfragment;import android.os.Bundle;import android.support.v4.app.Fragment;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;public class Fragment_b extends Fragment{    //这个类需要继承自android.support.v4.app.Fragment    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {        //初始化布局,第一个参数是需要解析的布局fragment_b,第二个参数是主布局container        View root = inflater.inflate(R.layout.fragment_b, container, false);        root.findViewById(R.id.btnBack).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                getFragmentManager().popBackStack();            }        });        return root;    }}

对应的fragment_b.xml

<?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">    <TextView        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="这是Fragment B"        android:id="@+id/textView" />    <Button        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="后退"        android:id="@+id/btnBack" /></LinearLayout>

逻辑思维图
这里写图片描述
效果图
这里写图片描述
注:从1.4.1开始就没有创建Project带Blank Activity with Fragment模式了。
这里写图片描述
须单独New Fragment

2、Fragment生命周期

onCreate()–onCreateView()–onPause()主要是掌握这3个即可
重写这3个方法,输出打印日志以观察Fragment的生命周期。
如:

    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        Log.d("Fragment生命周期", "onCreate");    }        @Override    public void onPause() {        super.onPause();        Log.d("Fragment生命周期", "onPause");    }

查看Android帮助文档
这里写图片描述
在线查看帮助文档
http://www.android-doc.com/guide/components/fragments.html

3、带侧边栏的Activity
New–Activity–Navigation Drawer Activity
这里写图片描述
Navigation Drawer Activity 译为“导航抽屉活动”,用来实现导航栏(或菜单栏)抽屉式效果,即侧滑导航栏设计风格
参考文章:http://www.codeceo.com/article/android-navigationdrawer.html

fragment_main.xml添加一个按钮,用于启动SliderActivity

    <Button        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="启动有侧边栏的Activity"        android:id="@+id/btnStartSliderActivity"/>

MainFragment.java添加访问到这个按钮的代码、以及添加事件监听器

        //访问到按钮        rootView.findViewById(R.id.btnStartSliderActivity).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                //添加事件监听器                startActivity(new Intent(getActivity(), SliderActivity.class));            }        });

这里写图片描述
4、Tabbed Activity
译为 标签活动

这里写图片描述
这里写图片描述

新建一个类Image1Fm.java,用于显示

package com.keen.learnfragment;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v4.app.Fragment;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;public class Image1Fm extends Fragment {    @Nullable    @Override    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {        ImageView iv = new ImageView(getActivity());        iv.setImageResource(R.drawable.img1);        return iv;    }}

同样创建Image2Fm.java和Image3Fm.java。

package com.keen.learnfragment;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v4.app.Fragment;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;public class Image2Fm extends Fragment {    @Nullable    @Override    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {        ImageView iv = new ImageView(getActivity());        iv.setImageResource(R.drawable.img2);        return iv;    }}
package com.keen.learnfragment;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v4.app.Fragment;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;public class Image3Fm extends Fragment {    @Nullable    @Override    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {        ImageView iv = new ImageView(getActivity());        iv.setImageResource(R.drawable.img3);        return iv;    }}

接着修改Tabs.java代码,主要是修改getItem()方法

        @Override        public Fragment getItem(int position) {            switch (position){                case 0:                    return new Image1Fm();                case 1:                    return new Image2Fm();                case 2:                    return new Image3Fm();            }            // getItem is called to instantiate the fragment for the given page.            // Return a PlaceholderFragment (defined as a static inner class below).            return null;        }

Fragment灵活性远远大于Activity,而且因为在应用程序内部,不需要创建基本组件,也无需在manifest里注册,因此,效果也是非常高的。
这里写图片描述

原创粉丝点击