android之Fragment
来源:互联网 发布:sql语句别名 编辑:程序博客网 时间:2024/04/27 18:53
作为替代TabHost的Fragment,也同样适用于平板开发。不得不说,Fragment的功能确实比TabHost强大,其在性质上相当于一个小型的Activity,和Activity一样具有相似生命周期。而且也是同生共死的,在大部分情况下。
1.Fragmengt的生命周期,和Activity有很多相似。
具体有onCreat这个方法一般用来初始化一些值,在onDestory只会加载一次,最好不要放一些加载网络的代码。onCreatView这里是加载布局的。onPause。onResume。onStop。onDesotoryView销毁视图。onDetach这个是用来和Activity脱离的方法。onDestory最后的销毁。
当Activity加载Fragmengt时,先加载Activity的onCreat,然后是Fragmengt的onCreat和onCreatView。当Fragmengt暂停时,先执行Fragmengt的onPause,然后是Activity的onPause,当Fragmengt回来时,先执行(看清)Activity的onResume,然后才是Fragmengt的onResume。
2.Fragmengt的简单使用。
底下是一个简单的Fragmengt的实现。左边是Activity自带的View,里面有两个按钮右边是一个空的LinearLayout,用来装载Fragmengt。
<span style="font-size:14px;"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" tools:context=".MainActivity"> <LinearLayout android:id="@+id/left" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:orientation="vertical"> <Button android:id="@+id/btn1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="First"/> <Button android:id="@+id/btn2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="Second"/> </LinearLayout> <LinearLayout android:id="@+id/right" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="3" android:orientation="vertical"> </LinearLayout></LinearLayout></span>Fragment中的代码很简单,就是在onCreatView中返回了一个实例化后的自己定义的视图。
<span style="font-size:14px;">public class MainActivity extends AppCompatActivity { FragmentManager fragmentManager; FragmentTransaction fragmentTransaction; Button btn1, btn2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //实例化按钮并加载监听器 btn1 = (Button) findViewById(R.id.btn1); btn2 = (Button) findViewById(R.id.btn2); btn1.setOnClickListener(new BtnListener()); btn2.setOnClickListener(new BtnListener()); //根据当前Activity获得一个FragmentTransaction对象 fragmentManager = getFragmentManager(); } //自定义按钮的监听器,使得点击按钮加载Fragment控件 class BtnListener implements View.OnClickListener { @Override public void onClick(View v) { //FragmentTransaction类可以完成对Fragment控件的add,remove,replace等功能 fragmentTransaction = fragmentManager.beginTransaction(); switch (v.getId()) { case R.id.btn1: //实例化FirstFragment FirstFragment firstFragment = new FirstFragment(); //加载firstFragment视图,并加入firstFragment回退栈的标记,不能用add方法 fragmentTransaction.replace(R.id.right, firstFragment, "firstFragment"); //加入回退栈,必须放在commit方法之前,这个方法使得Activity有序加载Fragment fragmentTransaction.addToBackStack("firstFragment"); break; case R.id.btn2: SecondFragment secondFragment = new SecondFragment(); fragmentTransaction.replace(R.id.right, secondFragment, "secondFragment"); fragmentTransaction.addToBackStack("secondFragment"); break; } //fragmentTransaction必须提交才能显示View,一般放于最后 fragmentTransaction.commit(); } }}</span>
这样点击左面的按钮,右面就会加载出响应的Fragment。
3.Fragment之间的传值,必须同时在同一个Activity中加载出来的时候才能传值。就像上面的模式是不能传的,会报空指针异常。
fragmentManager = getFragmentManager(); fragmentTransaction = fragmentManager.beginTransaction(); FirstFragment firstFragment = new FirstFragment(); SecondFragment secondFragment = new SecondFragment(); fragmentTransaction.replace(R.id.left, firstFragment, "firstFragment"); fragmentTransaction.replace(R.id.right, secondFragment, "secondFragment"); fragmentTransaction.commit();
<span style="font-size:18px;">底下这是其中一个Fragment中的</span><span style="font-size:18px; font-family: Arial, Helvetica, sans-serif;">onCreateView方法,两个一样。</span>
//给Fragmengt加载UI布局 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_first, container, false); Button btn = (Button) view.findViewById(R.id.firstBtn); //点击按钮获得secondFragment中输入框的值 btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //根据TAG实例化一个SecondFragment SecondFragment secondFragment = (SecondFragment) getFragmentManager().findFragmentByTag("secondFragment"); //实例化secondFragment中的EditText EditText editText = (EditText) secondFragment.getView().findViewById(R.id.secondEt); //Toast弹出editText的值 Toast.makeText(getActivity(), editText.getText().toString(), Toast.LENGTH_SHORT).show(); } }); return view; }
还有一种传值的方法,相当于Activity的Intent传值机制。只不过需要接受值得Fragment来调用setArguments()。在启动接受数据的Fragmengt时调用getArguments().getString(“key”)。等方法来接受值。必须是先setArguments()再加载Fragment,顺序要记好。
4.Fragment和Activity一样也有很多形式,例如ListFragment等。用法和ListActivity一样。记得适配器的初始化一定要在onCreat里,也就是onCreatView方法之前完成,加载完适配器之后记得adapter.notifyDataChanged()????这个方法的功能是通知所依附的View,本身的数据已经改变,要刷新View。
- android文档之Fragment
- Android昆仑镜之Fragment
- Android之Fragment
- android之Fragment
- Android学习之 Fragment
- android之Fragment
- android之Fragment
- Android之Fragment
- android之Fragment
- Android入门之Fragment
- Android之fragment初探
- Android之FragMent
- Android之Fragment通信
- Android之Fragment学习心得
- Android之Fragment优点
- android之Fragment
- Android之Fragment
- android之Fragment生命周期
- 面试中有可能遇到的算法题--Java算法
- 互联网协议入门(二)
- 【POJ解题】:POJ 2141解题报告
- 使用声明式启动job任务时报JobInitializationPlugin或XMLSchedulingDataProcessorPlugin实例化失败 解决方案
- ubuntu 15.04下使用Eclipse搭建Hadoop开发环境
- android之Fragment
- java项目中添加JAR包的方法
- SQL NOW() 函数
- 数组指针与指针数组
- SQL FORMAT() 函数
- 清除缓存,部分号码变为星号demo
- 异常安全,RAII与C++11 http://www.cnblogs.com/mavaL/articles/2515381.html
- Android实现自定义倒计时view
- win平台下搭建cocos2dx 3.5 lua开发环境