>>分享Android开发相关的技术 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 19083 个阅读者 刷新本主题
 * 贴子主题:  Android Fragments 详细使用 回复文章 点赞(0)  收藏  
作者:javathinker    发表时间:2020-05-15 06:43:22     消息  查看  搜索  好友  复制  引用

        

Fragments 诞生初衷

          自从Android 3.0中引入fragments 的概念,根据词海的翻译可以译为:碎片、片段。其上的是为了解决不同屏幕分辩率的动态和灵活UI设计。大屏幕如平板小屏幕如手机,平板电脑的设计使得其有更多的空间来放更多的UI组件,而多出来的空间存放UI使其会产生更多的交互,从而诞生了fragments 。fragments 的设计不需要你来亲自管理view hierarchy 的复杂变化,通过将Activity 的布局分散到frament 中,可以在运行时修改activity 的外观,并且由activity 管理的back stack 中保存些变化。  

Fragments 设计理念

           在设计应用时特别是Android 应用 ,有众多的分辨率要去适应,而fragments 可以让你在屏幕不同的屏幕上动态管理UI。例如:通讯应用程序(QQ),用户列表可以在左边,消息窗口在右边的设计。而在手机屏幕用户列表填充屏幕当点击某一用户时,则弹出对话窗口的设计,如下图:

         点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小    

Fragments的生命周期

         每一个fragments 都有自己的一套生命周期回调方法和处理自己的用户输入事件。 对应生命周期可参考下图:

         点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

          其中大多数程序必须使用Fragments 必须实现的三个回调方法分别为:

         onCreate

            系统创建Fragments 时调用,可做执行初始化工作或者当程序被暂停或停止时用来恢复状态,跟Activity 中的onCreate相当。

         onCreateView

            用于首次绘制用户界面的回调方法,必须返回要创建的Fragments 视图UI。假如你不希望提供Fragments 用户界面则可以返回NULL。

         onPause

             当用户离开这个Fragments 的时候调用,这时你要提交任何应该持久的变化,因为用户可能不会回来。更多的事件可以参考上图的生命周期关系图。    

Fragments 的类别

         系统内置了三种Fragments ,这三种Fragments 分别有不同的应用场景分别为:

         DialogFragment

          对话框式的Fragments,可以将一个fragments 对话框并到activity 管理的fragments back stack 中,允许用户回到一个前曾摒弃fragments.

         ListFragments

            类似于ListActivity 的效果,并且还提供了ListActivity 类似的onListItemCLick和setListAdapter等功能。

         PreferenceFragments

            类似于PreferenceActivity .可以创建类似IPAD的设置界面。                      

Fragments 的详细使用

         首先先来看一张DEMO 效果图:

         点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

             左边点击时,右边的字符会与左边选中的项的字符相同。与IPAD上的设置界面很相似,这一点是否借鉴了ipad 上的UI呢?

         XML文件:

      <? 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 ="horizontal"   >

         < fragment  class ="com.xuzhi.fragment.FragmentDemoActivity$TitlesFragment"  android:id ="@+id/titles"  android:layout_weight ="1"

           android:layout_width ="0px"  android:layout_height ="match_parent"

            />

           < FrameLayout  android:id ="@+id/details"  android:layout_weight ="1"  android:layout_width ="0px"  android:layout_height ="match_parent"

           android:background ="?android:attr/detailsElementBackground"

            >
          </ FrameLayout >

     </ LinearLayout >

      主界面代码(己做注释):

[code]      package  com.xuzhi.fragment;

     import android.app.Activity;

     import android.app.AlertDialog;

     import android.app.Fragment;

     import android.app.FragmentTransaction;

     import android.app.ListFragment;

     import android.os.Bundle;

     import android.util.TypedValue;

     import android.view.LayoutInflater;

     import android.view.View;

     import android.view.ViewGroup;

     import android.widget.ArrayAdapter;

     import android.widget.ListView;

     import android.widget.ScrollView;

     import android.widget.TextView;

     public  class FragmentDemoActivity  extends Activity {

        public  static String[] array = { "text1,", "text2", "text3", "text4",

                "text5,", "text6", "text7", "text8" };

          /**  Called when the activity is first created.  */

        @Override

         public  void onCreate(Bundle savedInstanceState) {

             super.onCreate(savedInstanceState);

            setContentView(R.layout.main);

        }

       public  static  class TitlesFragment  extends ListFragment {

             boolean mDualPane;

             int mCurCheckPosition = 0;

             @Override

             public  void onCreate(Bundle savedInstanceState) {

                 //  TODO Auto-generated method stub

                 super.onCreate(savedInstanceState);

                System.out.println("Fragment-->onCreate");

            }

             @Override

             public View onCreateView(LayoutInflater inflater, ViewGroup container,

                    Bundle savedInstanceState) {

                 //  TODO Auto-generated method stub

                System.out.println("Fragment-->onCreateView");

                 return  super.onCreateView(inflater, container, savedInstanceState);

            }

             @Override

             public  void onPause() {

                 //  TODO Auto-generated method stub

                 super.onPause();

                System.out.println("Fragment-->onPause");

            }

              @Override

             public  void onStop() {

                 //  TODO Auto-generated method stub

                 super.onStop();

                 System.out.println("Fragment-->onStop");

            }

             @Override

             public  void onAttach(Activity activity) {

                 //  TODO Auto-generated method stub

                 super.onAttach(activity);

                System.out.println("Fragment-->onAttach");

            }

             @Override

             public  void onStart() {

                 //  TODO Auto-generated method stub

                 super.onStart();

                System.out.println("Fragment-->onStart");

            }

             @Override

             public  void onResume() {

                 //  TODO Auto-generated method stub

                 super.onResume();

                System.out.println("Fragment-->onResume");

            }

              @Override

             public  void onDestroy() {

                 //  TODO Auto-generated method stub

                 super.onDestroy();

                System.out.println("Fragment-->onDestroy");

            }

             @Override

             public  void onActivityCreated(Bundle savedInstanceState) {

                 //  TODO Auto-generated method stub

                 super.onActivityCreated(savedInstanceState);

                System.out.println("Fragment-->onActivityCreted");

                setListAdapter( new ArrayAdapter<String>(getActivity(),

                        android.R.layout.simple_list_item_1, array));

                            View detailsFrame = getActivity().findViewById(R.id.details);

                            mDualPane = detailsFrame !=  null

                        && detailsFrame.getVisibility() == View.VISIBLE;

                if (savedInstanceState !=  null) {

                    mCurCheckPosition = savedInstanceState.getInt("curChoice", 0);  // 从保存的状态中取出数据

                }

                if (mDualPane) {

                    getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);

                     showDetails(mCurCheckPosition);

                }

            }

              @Override

             public  void onSaveInstanceState(Bundle outState) {

                 //  TODO Auto-generated method stub

                 super.onSaveInstanceState(outState);

                            outState.putInt("curChoice", mCurCheckPosition); // 保存当前的下标

            }

              @Override

             public  void onListItemClick(ListView l, View v,  int position,  long id) {

                 //  TODO Auto-generated method stub

                 super.onListItemClick(l, v, position, id);

                showDetails(position);

            }

            void showDetails( int index) {

                mCurCheckPosition = index;

                 if (mDualPane) {

                    getListView().setItemChecked(index,  true);

                    DetailsFragment details = (DetailsFragment) getFragmentManager()

                            .findFragmentById(R.id.details);

                     if (details ==  null || details.getShownIndex() != index) {

                        details = DetailsFragment.newInstance(mCurCheckPosition);

                                     // 得到一个fragment 事务(类似sqlite的操作)

                        FragmentTransaction ft = getFragmentManager()

                                .beginTransaction();

                        ft.replace(R.id.details, details); // 将得到的fragment 替换当前的viewGroup内容,add则不替换会依次累加

                        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); // 设置动画效果

                        ft.commit(); // 提交

                    }

                }  else {

                     new AlertDialog.Builder(getActivity()).setTitle(

                            android.R.string.dialog_alert_title).setMessage(

                            array[index]).setPositiveButton(android.R.string.ok,

                             null).show();

                }

            }

        }

         /**

         * 作为界面的一部分,为fragment 提供一个layout

         *  @author  terry

         *

          */


         public  static  class DetailsFragment  extends Fragment {

              public  static DetailsFragment newInstance( int index) {

                DetailsFragment details =  new DetailsFragment();

                Bundle args =  new Bundle();

                args.putInt("index", index);

                details.setArguments(args);

                 return details;

            }

            public  int getShownIndex() {

                 return getArguments().getInt("index", 0);

            }

            @Override

             public View onCreateView(LayoutInflater inflater, ViewGroup container,

                    Bundle savedInstanceState) {

                 //  TODO Auto-generated method stub

                 if (container ==  null)

                     return  null;

                    ScrollView scroller =  new ScrollView(getActivity());

                    TextView text =  new TextView(getActivity());

                    int padding = ( int) TypedValue.applyDimension(

                                TypedValue.COMPLEX_UNIT_DIP, 4, getActivity()

                                .getResources().getDisplayMetrics());

                     text.setPadding(padding, padding, padding, padding);

                      scroller.addView(text);

                            text.setText(array[getShownIndex()]);

                 return scroller;

            }

        }

    }

              注意:                      
  1. 如果你想在Fragment 里面创建menu,则必须在onCreate的时候设置让它可以存在optionMenu才可以创建,代码为:

              public  static  class DetailsFragment  extends Fragment {

                                    @Override

                     public  void onCreate(Bundle savedInstanceState) {

                         //  TODO Auto-generated method stub

                         super.onCreate(savedInstanceState);

                        setHasOptionsMenu( true);

                    }

            }

            之后的操作即可以像平常Android的menu用法一样,代码为:

                      @Override

                     public  void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {

                         //  TODO Auto-generated method stub

                         super.onCreateOptionsMenu(menu, inflater);

                         menu.add("Menu 1a").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);

                            menu.add("Menu 1b").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);

                    }

                      @Override

                     public  boolean onOptionsItemSelected(MenuItem item) {

                         //  TODO Auto-generated method stub

                        Toast.makeText(getActivity(), "index is"+getShownIndex()+" && menu text is "+item.getTitle(), 1000).show();

                         return  super.onOptionsItemSelected(item);

                    }

       更多详细的使用方法,请参考SDK和APIDEMO中相关的例子和解释。

----------------------------
原文链接:https://blog.51cto.com/terryblog/793310

程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2020-06-05 08:12:18 重新编辑]
  Java面向对象编程-->图形用户界面(下)
  JavaWeb开发-->使用Session(Ⅱ)
  JSP与Hibernate开发-->JPA API的高级用法
  Java网络编程-->用Axis发布Web服务
  精通Spring-->Vue简介
  Vue3开发-->计算属性和数据监听
  Android面试题汇总
  Android OpenGL 学习笔记
  浅析Android的通知系统
  Android中shape的使用
  在Window中下载Android源代码的步骤
  Android的init过程详解
  Android在SDcard建文件夹(在Android中移动文件必用)
  Android UI学习 - Tab的学习和使用
  Android内核开发:图解Android系统的启动过程
  Scroll的原理和简单使用
  Android Socket通信
  自定义ViewGroup和FrameLayout实现轮播图(包括底部小圆点)
  Android 服务(Service)
  Android 启动页倒计时自定义view实现
  Appbarlayout+Recycleview滑动效果颜色渐变
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。