android fragment详解
来源:互联网 发布:盛世网络兼职平台官网 编辑:程序博客网 时间:2024/06/01 07:12
1、fragment的简单介绍。
首先fragment的优点:
fragment可以为不同屏幕大小的设备创建动态灵活的UI(小屏幕手机到大屏幕平板电脑),极大提高了UI的灵活性。
每个frgment都是独立的,可以被多个activity公用,可以在一个正在显示的activity中执行添加、替换、删除的操作。
2、fragment的生命周期
package com.example.apple.myfilemanager;import android.app.Activity;import android.content.Context;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v4.app.Fragment;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;/** * Created by apple on 17/5/4. */public class Fragment1 extends Fragment { private final String TAG = "Fragment1"; /** * 一旦fragment已被创建,要创建它自己的用户界面时调用 * @param inflater * @param container * @param savedInstanceState * @return */ @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_1,null); Log.e(TAG,"每次创建都会去绘制Fragment的View组件时回调该方法;"); return view; } /** * 调用该方法时fragment会被连接到它的父activity上 * @param activity */ @Override public void onAttach(Activity activity) { super.onAttach(activity);//获取对父Activity的引用 Log.e(TAG,"当Fragment被添加到Activity时候会回调这个方法,并且只调用一次;"); } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG,"创建Fragment时会回调,只会调用一次;"); } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); Log.e(TAG,"当Fragment所在的Activity启动完成后调用,即父activity和fragment Ui已经被创建;"); } @Override public void onStart() { super.onStart(); Log.e(TAG,"启动Fragment,即fragment现在可见时"); } @Override public void onResume() { super.onResume(); Log.e(TAG,"恢复Fragment时会被回调(ui、线程或进程),调用onStart()方法后面一定会调用onResume()方法;"); } @Override public void onPause() { super.onPause(); Log.e(TAG,"当activity不是活动的前台时,需要暂停ui的更新、挂起线程或者暂停那些不需要更新的cpu的集中处理。由于调用该方法后,进程可能被终止" + "所以要保存所有的编辑和状态改变信息"); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); Log.e(TAG,"在活动生命周期结束时,调用该方法保存ui"); } /** * 可见生命周期结束时调用 */ @Override public void onStop() { super.onStop(); Log.e(TAG,"停止Fragment"); } /** * fragment的view被分离时调用 */ @Override public void onDestroyView() { super.onDestroyView(); Log.e(TAG,"清除资源相关的view"); } @Override public void onDestroy() { super.onDestroy(); Log.e(TAG,"销毁Fragment所包含的View组件时调用"); } @Override public void onDetach() { super.onDetach(); Log.e(TAG,"Fragment从Activity中删除时会回调该方法,并且这个方法只会调用一次"); }}
3、fragment Manager
每个activity都包含一个fragment manger来管理fragment
fragmentManager = getSupportFragmentManager();fragment Manager提供了很多方法用来访问添加到activity上的fragment,通过执行fragment transaction来添加、删除和替换。
beginTransaction.add(R.id.framelayout, fragment, tag); //beginTransaction.replace(R.id.framelayout,fragment); // beginTransaction.remove(fragment);
4、在activity中添加fragment
首先布局中代码
<FrameLayout android:id="@+id/framelayout" android:layout_width="match_parent" android:layout_height="match_parent"> </FrameLayout>在代码中实现添加、删除、替换fragment操作,但是首先要先添加fragment时要先指定一个tag标识,后面就可以通过这个标识通过findFrgmentByTag方法找到相应的fragment.
private void addFragment(Fragment fragment,String tag){ //获取事务 FragmentTransaction beginTransaction = fragmentManager.beginTransaction(); //第一个参数:要添加fragment容器 beginTransaction.add(R.id.framelayout, fragment, tag); //beginTransaction.replace(R.id.framelayout,fragment); // beginTransaction.remove(fragment); //将当前fragment添加到回退栈 beginTransaction.addToBackStack(tag); //提交 beginTransaction.commit(); }删除fragnment通过查找到对应id然后删除
FragmentTransaction beginTransaction = fragmentManager.beginTransaction(); Fragment fragment1 = fragmentManager.findFragmentById(R.id.fragment1); beginTransaction.remove(fragment1);
替换另一个fragment实现,可以使用replace,指定替换的fragment父容器的id。
private void replaceFragment(Fragment fragment){ FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.replace(R.id.framelayout,fragment); fragmentTransaction.commit(); }5、回退栈
fragment可以创建动态的activity布局,可以使ui界面改变,某些情况下可以视为一个新的屏幕,然后我们就可以使用回退栈了,可以回滚到之前的屏幕状态。
首先回滚到上一屏幕实现
ragmentManager.popBackStack("fragment2",0);还可以定tag标识回滚到特定的一屏
fragmentManager.popBackStack("fragment2",FragmentManager.POP_BACK_STACK_INCLUSIVE);通过点击进去还可以看到很多回滚的方法,可根据实际需求使用
public abstract void popBackStack();public abstract boolean popBackStackImmediate();public abstract boolean popBackStackImmediate(String name, int flags);除了上面的还可以实现统计回退栈中有多少个fragment,然后就可以通过判断标识tag回退到特定界面
int backStackEntryCount = fragmentManager.getBackStackEntryCount();
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { //回退栈中一共有多少个fragment int backStackEntryCount = fragmentManager.getBackStackEntryCount(); if (backStackEntryCount > 1) { fragmentManager.popBackStackImmediate(); //获取当前回退到什么位置---获取某个索引值下的栈内容 FragmentManager.BackStackEntry backStackEntry = fragmentManager .getBackStackEntryAt(fragmentManager .getBackStackEntryCount() - 1); String tagName = backStackEntry.getName(); if ("fragment1".equals(tagName)) { rg.check(R.id.rb_first); } else if ("fragment2".equals(tagName)) { rg.check(R.id.rb_second); } else if ("fragment3".equals(tagName)) { rg.check(R.id.rb_three); } else if ("fragment4".equals(tagName)) { rg.check(R.id.rb_four); } } else { finish(); } } //处理按键事件 return true; }如果我们要回退到最后一个,也可以像下面这样做,先统计回退栈中有多少个fragment然后通过判断一直回退到最后一个。
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { //回退栈中一共有多少个fragment int backStackEntryCount = fragmentManager.getBackStackEntryCount(); if (backStackEntryCount > 1) { //如果栈里面大于1,一直回退到最后一个 while (fragmentManager.getBackStackEntryCount()>1){ fragmentManager.popBackStackImmediate(); rg.check(R.id.rb_first); } } else { finish(); } } //处理按键事件 return true; }6、实现fragment和activity 之间接口
package com.example.apple.myfilemanager;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v4.app.Fragment;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.Button;/** * Created by apple on 17/5/4. */public class Fragment2 extends Fragment implements View.OnClickListener{ private final String TAG = "Fragment2"; private Button btnFragment2; private Fragment2BtnClickListener fragment2BtnClickListener ; @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_2, container, false); btnFragment2 = (Button)view.findViewById(R.id.btn_fragment2); btnFragment2.setOnClickListener(this); return view; } @Override public void onClick(View v) { if(fragment2BtnClickListener != null) { fragment2BtnClickListener.onFTwoBtnClick(v); } } public interface Fragment2BtnClickListener { void onFTwoBtnClick(View v); } //设置回调接口 public void setFragment2BtnClickListener(Fragment2BtnClickListener fragment2BtnClickListenr) { this.fragment2BtnClickListener = fragment2BtnClickListenr; }}activity中使用
fragment2 = new Fragment2(); fragment2.setFragment2BtnClickListener(new Fragment2.Fragment2BtnClickListener() { @Override public void onFTwoBtnClick(View v) { } });7、实现activity之间传值
private void sendData(){ FragmentTransaction beginTransaction = fragmentManager.beginTransaction(); Fragment1 fragment1 = new Fragment1(); Bundle bundle = new Bundle(); bundle.putString("str","fragment1"); fragment1.setArguments(bundle); beginTransaction.replace(R.id.framelayout, fragment1); beginTransaction.commit(); }
fragment中获取activity传递过来的值
package com.example.apple.myfilemanager;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v4.app.Fragment;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;/** * Created by apple on */public class Fragment3 extends Fragment { @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_3,null); Bundle bundle = getArguments();//从activity传过来的Bundle if(bundle!=null){ Log.e("fragment3",bundle.getString("str")); } return view; }}
最后fragment就学到这里。
阅读全文
0 0
- 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 - ToDoList(fragment) 详解
- Android Fragment 使用详解
- android fragment详解
- Android Fragment 生命周期详解
- Android详解fragment
- Android Fragment详解
- 旧键盘
- 纯CSS3社会化分享按钮
- Leetcote 130. Surrounded Regions
- 第一篇博客
- 基于BlueZ5.44协议栈的RTL8723 BLE蓝牙连接(一)
- android fragment详解
- 小朋友排队
- UVA 11375 Matches(递推)
- 是不是每一个IT人的身体都很差
- 模板之类模板(数组类模板)
- JAVA深入
- java 读写挂
- Android Binder,Android进程间通信机制原理详解
- 操作系统原理读书笔记之文件系统