• Fragment的理解


    1.生命周期

      

    启动Fragment时:

    onAttach
    onCreate
    onCreateView
    onViewCreated
    onActivityCreated
    onStart
    onResume

    启动后点击home键:

    onPause
    onSaveInstanceState
    onStop

    从home键再次进入:

    onStart
    onResume

    Fragment1-->Fragment2:

    fragment1: onPause onStop onDestroyView

    fragment2: 

     onAttach
     onCreate
     onCreateView
     onViewCreated
     onActivityCreated
     onStart
     onResume

    在回退Fragment2-->Fragment1:


    fragment1:onCreateView onActivityCreated onStart onResume

    点击back键退出:

    onPause
    onStop
    onDestroyView
    onDestroy
    onDetach

    如果启动2个Fragment后,点击back退出:

    两个Fragment交替调用 onPause,onStop。然后一一调用onDestoryView,onDestory,onDetach.

    2.Fragent底部导航的使用<忘了看的谁的博客源码了……>

       <1>结构图:

    <2> A-E fragment

    public class Tab_AFragment extends Fragment {
    
        private static final String TAG = "Tab_AFragment";
        public Tab_AFragment() {
            // Required empty public constructor
        }
    
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            // Inflate the layout for this fragment
            Log.d(TAG, "onCreateView");
            return inflater.inflate(R.layout.fragment_tab, container, false);
        }
    
    }

     Main.xml 布局

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main"
        android:layout_width="match_parent" android:layout_height="match_parent"
        android:orientation="vertical"
        android:background="#ffffff"
        tools:context="myapplication.com.myfragment.MainActivity">
    
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:orientation="vertical"
            >
    
            <FrameLayout
                android:id="@+id/tab_content"
                android:layout_width="fill_parent"
                android:layout_height="0dp"
                android:layout_weight="1.0"
                android:background="#77557799"
                />
    
            <RadioGroup
                android:id="@+id/tabs_rg"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                android:gravity="center"
    
                >
                <RadioButton
                    android:id="@+id/tab_rb_a"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:drawableTop="@drawable/tablatestalert"
                    android:button="@null"
                    android:text="Tab1"
                    android:textColor="#000000"
                    android:textSize="13sp"
                    android:layout_weight="1.0"
                    android:gravity="center"
                    android:singleLine="true"
                    android:checked="true"
                    android:background="@drawable/selector_tab"
                    />
                <RadioButton
                    android:id="@+id/tab_rb_b"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:drawableTop="@drawable/tabsearch"
                    android:button="@null"
                    android:text="Tab2"
                    android:textColor="#000000"
                    android:textSize="13sp"
                    android:layout_weight="1.0"
                    android:gravity="center"
                    android:singleLine="true"
                    android:background="@drawable/selector_tab"
                    />
    
                <RadioButton
                    android:id="@+id/tab_rb_c"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:drawableTop="@drawable/tabrecommd"
                    android:button="@null"
                    android:text="Tab3"
                    android:textColor="#000000"
                    android:textSize="13sp"
                    android:layout_weight="1.0"
                    android:gravity="center"
                    android:singleLine="true"
                    android:background="@drawable/selector_tab"
                    />
    
                <RadioButton
                    android:id="@+id/tab_rb_d"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:drawableTop="@drawable/tabconfigicon"
                    android:button="@null"
                    android:text="Tab4"
                    android:textColor="#000000"
                    android:textSize="13sp"
                    android:layout_weight="1.0"
                    android:gravity="center"
                    android:singleLine="true"
                    android:background="@drawable/selector_tab"
                    />
                <RadioButton
                    android:id="@+id/tab_rb_e"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:drawableTop="@drawable/tababoutus"
                    android:button="@null"
                    android:text="Tab5"
                    android:textColor="#000000"
                    android:textSize="13sp"
                    android:layout_weight="1.0"
                    android:gravity="center"
                    android:singleLine="true"
                    android:background="@drawable/selector_tab"
                    />
    
            </RadioGroup>
        </LinearLayout>
    </LinearLayout>

    选择:

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <!-- 默认时的图片 -->
        <item android:drawable="@android:color/transparent" android:state_checked="false"/>
        <!-- 选择时的图片 -->
        <item android:drawable="@color/tab_selected_bg" android:state_checked="true"/>
    </selector>

    MainActivity

    public class MainActivity extends AppCompatActivity {
        private RadioGroup rgs;
        public List<Fragment> fragments = new ArrayList<Fragment>();
    
        public String hello = "hello ";
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            fragments.add(new Tab_AFragment());
            fragments.add(new Tab_BFragment());
            fragments.add(new Tab_CFragment());
            fragments.add(new Tab_DFragment());
            fragments.add(new Tab_EFragment());
    
    
            rgs = (RadioGroup) findViewById(R.id.tabs_rg);
    
            FragmentTabAdapter tabAdapter = new FragmentTabAdapter(this, fragments, R.id.tab_content, rgs);
            tabAdapter.setOnRgsExtraCheckedChangedListener(new FragmentTabAdapter.OnRgsExtraCheckedChangedListener(){
                @Override
                public void OnRgsExtraCheckedChanged(RadioGroup radioGroup, int checkedId, int index) {
                    System.out.println("Extra---- " + index + " checked!!! ");
                }
            });
    
        }
    
    
    }
     FragmentTabAdapter

    public class FragmentTabAdapter implements RadioGroup.OnCheckedChangeListener{
        /**
         * tab对应的fragments
         */
        private List<Fragment> fragments;
        /**
         * 单选按钮组,用于切换tab
         */
        private RadioGroup rgs;
        /**
         * fragment 所属的activity
         */
        private FragmentActivity fragmentActivity;
        /**
         * activity 中展示fragment的区域id
         */
        private int fragmentContentId;
    
        /**
         * 当前tab页面的索引
         */
        private int currentTab;
    
        /**
         * 用于让调用者在切换tab时候增加新的功能
         */
        private OnRgsExtraCheckedChangedListener onRgsExtraCheckedChangedListener;
    
        public FragmentTabAdapter(FragmentActivity fragmentActivity, List<Fragment> fragments, int fragmentContentId, RadioGroup rgs) {
            this.fragments = fragments;
            this.rgs = rgs;
            this.fragmentActivity = fragmentActivity;
            this.fragmentContentId = fragmentContentId;
    
            // 默认显示第一页
            FragmentTransaction ft = fragmentActivity.getSupportFragmentManager().beginTransaction();
    
            ft.add(fragmentContentId, fragments.get(0));
            ft.commit();
    
            rgs.setOnCheckedChangeListener(this);
    
    
        }
    
        @Override
        public void onCheckedChanged(RadioGroup radioGroup, int checkedId) {
            for(int i = 0; i < rgs.getChildCount(); i++){
                if(rgs.getChildAt(i).getId() == checkedId){
                    Fragment fragment = fragments.get(i);
                    FragmentTransaction ft = obtainFragmentTransaction(i);
    
                    getCurrentFragment().onPause(); // 暂停当前tab
    //                getCurrentFragment().onStop(); // 暂停当前tab
    
                    if(fragment.isAdded()){
    //                    fragment.onStart(); // 启动目标tab的onStart()
                        fragment.onResume(); // 启动目标tab的onResume()
                    }else{
                        ft.add(fragmentContentId, fragment);
                    }
                    showTab(i); // 显示目标tab
                    ft.commit();
    
                    // 如果设置了切换tab额外功能功能接口
                    if(null != onRgsExtraCheckedChangedListener){
                        onRgsExtraCheckedChangedListener.OnRgsExtraCheckedChanged(radioGroup, checkedId, i);
                    }
    
                }
            }
    
        }
    
        /**
         * 切换tab
         * @param idx
         */
        private void showTab(int idx){
            for(int i = 0; i < fragments.size(); i++){
                Fragment fragment = fragments.get(i);
                FragmentTransaction ft = obtainFragmentTransaction(idx);
    
                if(idx == i){
                    ft.show(fragment);
                }else{
                    ft.hide(fragment);
                }
                ft.commit();
            }
            currentTab = idx; // 更新目标tab为当前tab
        }
    
        /**
         * 获取一个带动画的FragmentTransaction
         * @param index
         * @return
         */
        private FragmentTransaction obtainFragmentTransaction(int index){
            FragmentTransaction ft = fragmentActivity.getSupportFragmentManager().beginTransaction();
            // 设置切换动画
            if(index > currentTab){
                ft.setCustomAnimations(R.anim.slide_left_in, R.anim.slide_left_out);
            }else{
                ft.setCustomAnimations(R.anim.slide_right_in, R.anim.slide_right_out);
            }
            return ft;
        }
    
        public int getCurrentTab() {
            return currentTab;
        }
    
        public Fragment getCurrentFragment(){
            return fragments.get(currentTab);
        }
    
        public OnRgsExtraCheckedChangedListener getOnRgsExtraCheckedChangedListener() {
            return onRgsExtraCheckedChangedListener;
        }
    
        public void setOnRgsExtraCheckedChangedListener(OnRgsExtraCheckedChangedListener onRgsExtraCheckedChangedListener) {
            this.onRgsExtraCheckedChangedListener = onRgsExtraCheckedChangedListener;
        }
    
        /**
         *  切换tab额外功能功能接口
         */
        static class OnRgsExtraCheckedChangedListener{
            public void OnRgsExtraCheckedChanged(RadioGroup radioGroup, int checkedId, int index){
    
            }
        }
    
    }

    <3>效果图

    <4>code:

    http://pan.baidu.com/s/1gf3KKSz
    View Code
     
    今天多一点积累,明天少一分烦恼
  • 相关阅读:
    ThreadLocal设计模式 .
    转 Spring @Transactional 声明式事务管理 getCurrentSession
    SQL2008R2 安装提示:”System.Configuration.ConfigurationErrorsException: 创建 userSettings/Microsoft.SqlServe“ 和“安装了 Microsoft Visual Studio 2008 的早期版本“错误的解决办
    根据.mdf文件查看 SQL数据库的版本信息
    带参中文乱码问题 encodeURI和decodeURI
    接收表单参数的几种方法
    HttpClient 解释
    Java annotation 自定义注释@interface的用法
    RedisDesktopManager无法连接虚拟机中启动的redis服务问题解决
    项目里面加入redis单机版 和集群版的配置
  • 原文地址:https://www.cnblogs.com/galibujianbusana/p/6432784.html
Copyright © 2020-2023  润新知