Android开发: fragment解析及案例_安卓软件开发教程-查字典教程网
Android开发: fragment解析及案例
Android开发: fragment解析及案例
发布时间:2016-03-28 来源:查字典编辑
摘要:Fragment设计理念在设计应用时特别是Android应用,有众多的分辨率要去适应,而fragments可以让你在屏幕不同的屏幕上动态管理...

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

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

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

onCreate

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

onCreateView

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

onPause

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

Fragment 的类别

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

DialogFragment

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

ListFragments

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

PreferenceFragments

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

Fragment 的详细使用首先先来看一张DEMO 效果图:

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

相就的XML文件:

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

packagecom.xuzhi.fragment; importandroid.app.Activity; importandroid.app.AlertDialog; importandroid.app.Fragment; importandroid.app.FragmentTransaction; importandroid.app.ListFragment; importandroid.os.Bundle; importandroid.util.TypedValue; youtInflater; importandroid.view.View; importandroid.view.ViewGroup; importandroid.widget.ArrayAdapter; importandroid.widget.ListView; importandroid.widget.ScrollView; importandroid.widget.TextView; publicclassFragmentDemoActivityextendsActivity{ publicstaticString[]array={"text1,","text2","text3","text4", "text5,","text6","text7","text8"}; /**Calledwhentheactivityisfirstcreated.*/ @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(yout.main); } publicstaticclassTitlesFragmentextendsListFragment{ booleanmDualPane; intmCurCheckPosition=0; @Override publicvoidonCreate(BundlesavedInstanceState){ //TODOAuto-generatedmethodstub super.onCreate(savedInstanceState); System.out.println("Fragment-->onCreate"); } @Override publicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer, BundlesavedInstanceState){ //TODOAuto-generatedmethodstub System.out.println("Fragment-->onCreateView"); returnsuper.onCreateView(inflater,container,savedInstanceState); } @Override publicvoidonPause(){ //TODOAuto-generatedmethodstub super.onPause(); System.out.println("Fragment-->onPause"); } @Override publicvoidonStop(){ //TODOAuto-generatedmethodstub super.onStop(); System.out.println("Fragment-->onStop"); } @Override publicvoidonAttach(Activityactivity){ //TODOAuto-generatedmethodstub super.onAttach(activity); System.out.println("Fragment-->onAttach"); } @Override publicvoidonStart(){ //TODOAuto-generatedmethodstub super.onStart(); System.out.println("Fragment-->onStart"); } @Override publicvoidonResume(){ //TODOAuto-generatedmethodstub super.onResume(); System.out.println("Fragment-->onResume"); } @Override publicvoidonDestroy(){ //TODOAuto-generatedmethodstub super.onDestroy(); System.out.println("Fragment-->onDestroy"); } @Override publicvoidonActivityCreated(BundlesavedInstanceState){ //TODOAuto-generatedmethodstub super.onActivityCreated(savedInstanceState); System.out.println("Fragment-->onActivityCreted"); setListAdapter(newArrayAdapter(getActivity(), yout.simple_list_item_1,array)); ViewdetailsFrame=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 publicvoidonSaveInstanceState(BundleoutState){ //TODOAuto-generatedmethodstub super.onSaveInstanceState(outState); outState.putInt("curChoice",mCurCheckPosition);//保存当前的下标 } @Override publicvoidonListItemClick(ListViewl,Viewv,intposition,longid){ //TODOAuto-generatedmethodstub super.onListItemClick(l,v,position,id); showDetails(position); } voidshowDetails(intindex){ mCurCheckPosition=index; if(mDualPane){ getListView().setItemChecked(index,true); DetailsFragmentdetails=(DetailsFragment)getFragmentManager() .findFragmentById(R.id.details); if(details==null||details.getShownIndex()!=index){ details=DetailsFragment.newInstance(mCurCheckPosition); //得到一个fragment事务(类似sqlite的操作) FragmentTransactionft=getFragmentManager() .beginTransaction(); ft.replace(R.id.details,details);//将得到的fragment替换当前的viewGroup内容,add则不替换会依次累加 ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);//设置动画效果 mit();//提交 } }else{ newAlertDialog.Builder(getActivity()).setTitle( android.R.string.dialog_alert_title).setMessage( array[index]).setPositiveButton(android.R.string.ok, null).show(); } } } /** *作为界面的一部分,为fragment提供一个layout *@authorterry * */ publicstaticclassDetailsFragmentextendsFragment{ publicstaticDetailsFragmentnewInstance(intindex){ DetailsFragmentdetails=newDetailsFragment(); Bundleargs=newBundle(); args.putInt("index",index); details.setArguments(args); returndetails; } publicintgetShownIndex(){ returngetArguments().getInt("index",0); } @Override publicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer, BundlesavedInstanceState){ //TODOAuto-generatedmethodstub if(container==null) returnnull; ScrollViewscroller=newScrollView(getActivity()); TextViewtext=newTextView(getActivity()); intpadding=(int)TypedValue.applyDimension( PLEX_UNIT_DIP,4,getActivity() .getResources().getDisplayMetrics()); text.setPadding(padding,padding,padding,padding); scroller.addView(text); text.setText(array[getShownIndex()]); returnscroller; } } } 注意:

如果你想在Fragment 里面创建menu,则必须在onCreate的时候设置让它可以存在optionMenu才可以创建,代码为: publicstaticclassDetailsFragmentextendsFragment{ @Override publicvoidonCreate(BundlesavedInstanceState){ //TODOAuto-generatedmethodstub super.onCreate(savedInstanceState); setHasOptionsMenu(true); } }之后的操作即可以像平常Android的menu用法一样,代码为:

@Override publicvoidonCreateOptionsMenu(Menumenu,MenuInflaterinflater){ //TODOAuto-generatedmethodstub super.onCreateOptionsMenu(menu,inflater); menu.add("Menu1a").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); menu.add("Menu1b").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); } @Override publicbooleanonOptionsItemSelected(MenuItemitem){ //TODOAuto-generatedmethodstub Toast.makeText(getActivity(),"indexis"+getShownIndex()+"&&menutextis"+item.getTitle(),1000).show(); returnsuper.onOptionsItemSelected(item); }

相关阅读
推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  • 最新安卓软件开发学习
    热门安卓软件开发学习
    编程开发子分类