APIDemo分析:fragment的使用方法
2014-03-27 17:28
459 查看
public class FragmentArguments extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.e("_____tag", "onCreate in main avtivity___1"); setContentView(R.layout.fragment_arguments); Log.e("_____tag", "onCreate in main avtivity____2"); if (savedInstanceState != null) { // First-time init; create fragment to embed in activity. FragmentTransaction ft = getFragmentManager().beginTransaction(); Fragment newFragment = MyFragment.newInstance("From Arguments"); ft.add(R.id.created, newFragment); ft.commit(); Log.e("_____tag", "onCreate in main avtivity____3"); } } public static class MyFragment extends Fragment { CharSequence mLabel; /** * Create a new instance of MyFragment that will be initialized with the * given arguments. */ static MyFragment newInstance(CharSequence label) { MyFragment f = new MyFragment(); Bundle b = new Bundle(); b.putCharSequence("label", label); f.setArguments(b); return f; } /** * Parse attributes during inflation from a view hierarchy into the * arguments we handle. */ @SuppressLint("NewApi") @Override public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) { super.onInflate(activity, attrs, savedInstanceState); Log.e("_____tag", "onInflate in MyFragment______1"); TypedArray a = activity.obtainStyledAttributes(attrs, R.styleable.FragmentArguments); mLabel = a.getText(R.styleable.FragmentArguments_android_label); Log.e("_____tag", (String)mLabel + "in onInflate in MyFragment______2"); a.recycle(); } /** * During creation, if arguments have been supplied to the fragment then * parse those out. */ @SuppressLint("NewApi") @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.e("_____tag", "onCreate in fragment"); Bundle args = getArguments(); Log.e("_____tag", (String)mLabel + "onCreate in MyFragment____1"); if (args != null) { mLabel = args.getCharSequence("label", mLabel); Log.e("_____tag", (String)mLabel + "in onCreate in MyFragment____2"); } } /** * Create the view for this fragment, using the arguments given to it. */ @SuppressWarnings("deprecation") @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.e("_____tag", "onCreateView in MyFragment____1"); View v = inflater.inflate(R.layout.hello_world, container, false); View tv = v.findViewById(R.id.text); Log.e("_____tag", (String)mLabel + "in onCreateView in MyFragment____2"); ((TextView) tv).setText(mLabel != null ? mLabel : "(no label)"); tv.setBackgroundDrawable(getResources().getDrawable( android.R.drawable.gallery_thumb)); return v; } } }
好吧这是APIDemo的源码,里面加了点log用来分析的。
setContentView(R.layout.fragment_arguments);这个显示用户界面信息,来看看fragment_arguments.xml文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:padding="4dip" android:gravity="center_horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="0" android:padding="4dip" android:layout_gravity="center_vertical|center_horizontal" android:gravity="top|center_horizontal" android:textAppearance="?android:attr/textAppearanceMedium" android:text="@string/fragment_arguments_msg" /> <LinearLayout android:orientation="horizontal" android:padding="4dip" android:layout_width="match_parent" android:layout_height="wrap_content"> <fragment class="com.example.android.apis.app.FragmentArguments$MyFragment" android:id="@+id/embedded" android:layout_width="0px" android:layout_height="wrap_content" android:layout_weight="1" android:label="@string/fragment_arguments_embedded" /> <FrameLayout android:id="@+id/created" android:layout_width="0px" android:layout_height="wrap_content" android:layout_weight="1" /> </LinearLayout> </LinearLayout>
LinearLayout就不说了,主要是fragment 和FrameLayout这2个标签. 第一个fragment指定了类MyFragment,就是在Activity里面定义的内部类。指定了类那么在setContentView的时候再内部调用了MyFragment类中复写的一些方法就可以显示一个fragment提供的UI 布局(From Attributes这个框框)。
水平布局layout_weight=1,在From Attributes普遍还有一个FrameLayout目前还是没有UI界面显示出来
if (savedInstanceState != null) { // First-time init; create fragment to embed in activity. FragmentTransaction ft = getFragmentManager().beginTransaction(); Fragment newFragment = MyFragment.newInstance("From Arguments"); ft.add(R.id.created, newFragment); ft.commit(); Log.e("_____tag", "onCreate in main avtivity____3"); }
本来savedInstanceState == null是这样的条件,在第一次初始化的时候savedInstanceState 这个值应该是空的!可以进入IF,一个MyFragment添加到了R.id.created,commit提交后,就可以显示在屏幕上了。
每使用MyFragment创建一个对象用来显示在屏幕上,MyFragment的生命周期就会执行,即MyFragment复写的几个函数会执行。
这里发现了2类实用Fragment的不同方法。
1.直接在xml文件里面添加自定义的fragment类的标签实用,
2.在xml里面布局framelayout标签,获取ID后,将MyFragment使用FragmentTransaction对象的 add方法添加的指定的ID,commit提交后显示界面
思考:自定义的MyFragment出现在xml里面的时候只是可以使用例程中的方法指定类名吗,直接使用类名作为标签可以吗?
在xml里面布局的标签不使用framelayout,使用其他标签例如Linraelayout,可以在里面commit自定义的fragment 吗?
FragmentTransaction可以用来管理MyFragment,还有关于back stack的处理是和它相关的看看其他例子FragmentTransaction是怎么管理Fragment的。。。
相关文章推荐
- jQuery.buildFragment使用方法及思路分析
- jQuery.buildFragment使用方法及思路分析
- APIDemo学习笔记——Android上几种简单的Animation使用方法(二)
- APIDemo学习笔记——Android上几种简单的Animation使用方法
- 仿APiDemo使用ProgressDialog 并解决调用dismiss方法后没有对话框不消失的问题
- APIDemo学习笔记——Android上几种简单的Animation使用方法(三)——3D Transition
- APIDemo学习笔记——Android上几种简单的Animation使用方法(一)
- APIDemo学习笔记——Android上几种简单的Animation使用方法(二)
- Fragment使用出现空白页的解决方法
- 一种新的MAT使用方法分析内存溢出问题
- 原创分析:iOS 中使用 Mobile Installation 安装 IPA(使用iTunes/AppStore一样的安装API)
- 使用ArcGIS API for Silverlight实现地形坡度在线分析
- CUDA 存储器种类分析及使用方法指南
- Yii2框架中日志的使用方法分析
- Fragment和FragmentActivity的使用方法 .
- BaiduMap---百度地图官方Demo之MapFragment使用(创建一个基于Fragment的地图框架)
- C语言的常用库函数使用方法分析及用途(2)
- C语言的常用库函数使用方法分析及用途(15)
- Anddroid使用Fragment的setUserVisibleHint方法实现延时加载
- ajax小demo---CORS的原理分析及简单使用