关于Fragment的一些知识点
2017-01-03 11:52
429 查看
如果布局是固定的,不用动态添加fragment的,可以将业务逻辑写在fragment里,然后将fragment作为控件写在xml布局中。
getActivity()方法有可能会获取一个null值,建议在fragment中定义一个Context的变量,然后在onAttach(Activity)或者onAttach(Context)方法里为其赋值,如果该Context需要在Activity被销毁后还存在,则使用Context.getApplicationContext()。。
一般的类似京东淘宝的那种主流布局可以使用RadioGroup + FrameLayout + Fragment实现,或者RadioGroup + ViewPager + Fragment然后禁用ViewPager的滑动即可;类似可以滑动的则使用RadioGroup + ViewPager + Fragment实现。
FragmentTransaction的常用方法:
transaction.add() :添加一个fragment;
transaction.remove():移除一个fragment,若被移除的fragment未添加入回退栈,则会被直接销毁。
transaction.replace(): 替换当前的fragment,相当于先remove()再add()。
transaction.hide():隐藏当前fragment,该fragment依旧存在,并未被销毁。
transaction.show():显示被隐藏的fragment。fragment的onHiddenChanged(boolean hidden)方法可以检测fragment的状态。
FragmentTransaction.addToBackStack(String):将fragment添加入回退栈,这样点击返回键就不会退出当前的Activity,而是退出fragment了。
Fragment与Activity的通信:
如果你Activity中包含自己管理的Fragment的引用,可以通过引用直接访问所有的Fragment的public方法
如果Activity中未保存任何Fragment的引用,但为每个fragment在添加时设置了一个TAG,或者在布局中为Fragment设置了id,可以通过getFragmentManager.findFragmentByTag()或者findFragmentById()获得任何Fragment实例,然后进行操作。
在Fragment中可以通过onAttach(Activity)或者getActivity()取得activity。
因为要考虑Fragment的重复使用,所以必须降低Fragment与Activity的耦合,而且Fragment更不应该直接操作别的Fragment,毕竟Fragment操作应该由它的管理者Activity来决定。所以通过回调的方式,由宿主Activity或者其他Fragment决定是否处理按钮的监听事件。
fragment的实现如下:
activity的实现如下:
为了防止在activity的状态发生变化创建重复的fragment,故可以在activity的onCreate()方法里判断saveInstanceState是否为null,为null时才新建fragment。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:weightSum="2" tools:context="com.zhangym.study.fragmentstudydem.MainActivity"> <fragment android:name="com.zhangym.study.fragmentstudydem.FragmentA" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" tools:layout="@layout/fragment_a" /> <fragment android:name="com.zhangym.study.fragmentstudydem.FragmentB" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" tools:layout="@layout/fragment_b" /></LinearLayout>
getActivity()方法有可能会获取一个null值,建议在fragment中定义一个Context的变量,然后在onAttach(Activity)或者onAttach(Context)方法里为其赋值,如果该Context需要在Activity被销毁后还存在,则使用Context.getApplicationContext()。。
public class FragmentA extends Fragment { private Context mContext; @Override public void onAttach(Context context) { super.onAttach(context); mContext = context; } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_a,container,false); view.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(mContext, "我是FragmentA!", Toast.LENGTH_SHORT).show(); } }); return view; } }
一般的类似京东淘宝的那种主流布局可以使用RadioGroup + FrameLayout + Fragment实现,或者RadioGroup + ViewPager + Fragment然后禁用ViewPager的滑动即可;类似可以滑动的则使用RadioGroup + ViewPager + Fragment实现。
FragmentTransaction的常用方法:
transaction.add() :添加一个fragment;
transaction.remove():移除一个fragment,若被移除的fragment未添加入回退栈,则会被直接销毁。
transaction.replace(): 替换当前的fragment,相当于先remove()再add()。
transaction.hide():隐藏当前fragment,该fragment依旧存在,并未被销毁。
transaction.show():显示被隐藏的fragment。fragment的onHiddenChanged(boolean hidden)方法可以检测fragment的状态。
FragmentTransaction.addToBackStack(String):将fragment添加入回退栈,这样点击返回键就不会退出当前的Activity,而是退出fragment了。
FragmentManager manager = getFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); transaction.add(R.id.frameLayout,new FragmentB(),"FragmentB"); transaction.addToBackStack(null); transaction.commit();
Fragment与Activity的通信:
如果你Activity中包含自己管理的Fragment的引用,可以通过引用直接访问所有的Fragment的public方法
如果Activity中未保存任何Fragment的引用,但为每个fragment在添加时设置了一个TAG,或者在布局中为Fragment设置了id,可以通过getFragmentManager.findFragmentByTag()或者findFragmentById()获得任何Fragment实例,然后进行操作。
在Fragment中可以通过onAttach(Activity)或者getActivity()取得activity。
因为要考虑Fragment的重复使用,所以必须降低Fragment与Activity的耦合,而且Fragment更不应该直接操作别的Fragment,毕竟Fragment操作应该由它的管理者Activity来决定。所以通过回调的方式,由宿主Activity或者其他Fragment决定是否处理按钮的监听事件。
fragment的实现如下:
public class FragmentA extends Fragment implements View.OnClickListener { private Context mContext; @Override public void onAttach(Context context) { super.onAttach(context); mContext = context; } /** * 设置按钮点击的回调 */ public interface FragmentAClickListener { void onFragmentAClick(); } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_a, container, false); // view.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { // @Override // public void onClick(View view) { // FragmentManager manager = getFragmentManager(); // FragmentTransaction transaction = manager.beginTransaction(); // transaction.add(R.id.frameLayout,new FragmentB(),"FragmentB"); // transaction.addToBackStack(null); // transaction.commit(); // } // }); view.findViewById(R.id.button).setOnClickListener(this); return view; } @Override public void onClick(View view) { // 判断如果activity实现了该接口,则执行activity里实现的onFragmentAClick()方法。 if (mContext instanceof FragmentAClickListener) { ((FragmentAClickListener) mContext).onFragmentAClick(); } } }
activity的实现如下:
public class MainActivity extends AppCompatActivity implements FragmentA.FragmentAClickListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); FragmentManager manager = getFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); transaction.add(R.id.frameLayout, new FragmentA(), "FragmentA"); transaction.commit(); } @Override public void onFragmentAClick() { Toast.makeText(this, "test", Toast.LENGTH_SHORT).show(); } }
为了防止在activity的状态发生变化创建重复的fragment,故可以在activity的onCreate()方法里判断saveInstanceState是否为null,为null时才新建fragment。
public class MainActivity extends AppCompatActivity implements FragmentA.FragmentAClickListener { private FragmentA mFragmentA; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (savedInstanceState == null){ mFragmentA = new FragmentA(); } FragmentManager manager = getFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); transaction.add(R.id.frameLayout, mFragmentA, "FragmentA"); transaction.commit(); mFragmentA.setFragmentAClickLister(this); } @Override public void onFragmentAClick() { Toast.makeText(this, "test", Toast.LENGTH_SHORT).show(); } }
相关文章推荐
- ASP.Net一些知识点(关于.net与JS如何交互)
- 一些关于VC的知识点
- 关于Linux Shell的一些初级零碎知识点
- 关于tomcat的一些知识点
- 一些关于Java的琐碎知识点
- 关于VxWorks的一些知识点
- 关于UIImage的一些知识点网站
- 设计模式-关于模式的一些很基本的知识点
- 一些关于Java的琐碎基本知识点
- 关于LabWindows/CVI设计的一些知识点
- 关于java一些知识点的总结
- 关于Windows Installer的一些知识点
- 关于广播的一些知识点
- 关于socket,port的一些知识点
- 关于期权行权培训的一些知识点
- 关于treeview的一些知识点
- MOSS中关于User Profile的一些知识点
- php中关于mysqli和mysql区别的一些知识点分析
- 关于Event的一些知识点
- 黑马程序员-关于安卓的一些知识点摘录