Fragment的初级使用手记

这只是我在学Android过程中对于所学知识的巩固和方便日后查询的学习笔记,能帮助到有需要的和我一样的初学者就更好了

强烈建议使用V4库中的Fragment来达到更好的兼容性

使用时只需新建MyFragment继承Fragment,并重写View onCreateView()来动态加载即可

首先

<fragment
android:id="......"
android:name="......"
//也就是MyFragment(完整包名+类名,类似:com.example.Test.MyFragment)
......
/>

其次

public class MyFragment extends Fragment{
    @override
    public View onCreateView(LayoutInflater inflater ,ViewGroup container ,Bundle savedInstanceState){
        View view=inflater.inflate(R.layout. ... ,container,false);
        return view;
    }//Fragment中的UI控件也加在与此方法中
}

就这么简单

Fragment的替换(配合FrameLayout)

要注意

Fragment的替换并不是两个Fragment相互替换,而是去替换空白的FrameLayout

**<FrameLayout id="@+id/frame_layout" />
假设 有两个id分别为fragment1,fragment2的碎片

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    @override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button=(Button)findViewById(R.id.changefragmen);
        button.setonClickListener(this);
        replaceFragment(new Fragment1());
    }
    @override
    public void onClick(View v){
        switch (v.getId()){
            case R.id.changefragment:
                replaceFragment(new Fragment2());
                break;
            default:
                break;
        }
    }
    private void replaceFragment(Fragment fragment){
    //替换的相关代码
        FragmentManager manager=getSupportFragmentManager();
        FragmentTransaction transaction=manager.beginTransaction();
        transaction.replace(R.id.frame_layout ,fragment);//后者替换前者
        //可以看出并非fragment2替换了fragment1
        //而是代替了fragment1去替换frame_layout
        transaction.commit();
    }
}

与Activity的通信

引用了Fragment的Activity中获取Fragment实例

MyFragment fragment=(MyFragment)getSupportManager().findFragmentById(R.id.fragment);

Fragment要使用Context对象时getActivity()即可
Fragment中获取Activity对象

MainActivity activity=(MainActivity)getActivity();

Fragment间通信

先获取另一碎片所属活动的实例再由上面方法即可获取碎片实例

生命周期

onAttach() onCreate() onCreateView() onActivityCreated
onStart() onResume() onPause() onStop()
onDestroyView() onDestroy() onDetach()

注意事项

1、fragment是可以加入返回桟的从而达到back键回到替换前的fragment而不是退出应用
只需在 transaction.commit();前addToBackStack(null);


.......
transaction.addToBackStack(null);//参数为一个用于描述返回栈状态的名字
transaction.commit();

2、很多时候一切设置妥当但是运行时报有关fragment的错:
我遇到此问题时一般都是由于很少用到id,所以<fragment >中没有设置id这个属性,设置后就正常了,别的问题还没遇到
3、引入Fragment时右侧预览总是报错而且无法正常显示Fragment,但是运行起来没问题,我也不知道原因

补充

有些情况下需要将继承了SurfaceView的类加载于Fragment中,例如MySurfaceView。加载至Activity中时

setonContentView(new MySurfaceView());

当时要加载到Fragment中时我却不知该怎么办,后来看Activity中的加载方法联想到Fragment中和View有联系的方法中加载是否可行。
于是

public class MyFragment extends Fragment{
    @override
    public View onCreateView(LayoutInflater inflater ,ViewGroup container ,Bundle savedInstanceState){
        View view=new MySurfaceView();
        return view;
    }
}

发现可以达到预期效果

如有错误欢迎指正

结束

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,387评论 25 708
  • Fragment 描述:   翻译可以译为:碎片、片段,Android 3.0开始引入fragments 的概念;...
    Lost_Robot阅读 1,751评论 0 11
  • 前言 Fragment想必大家不陌生吧,在日常开发中,对于Fragment的使用也很频繁,现在主流的APP中,基本...
    斜杠时光阅读 2,594评论 4 22
  • 想研究美图的初衷在于其做为厦门目前最知名的互联网公司之神秘(身为厦门人的我更为好奇)。 而且这2年其动作之频繁: ...
    ElekChen阅读 497评论 4 2
  • Android从KitKat(Android SDK 4.4, API Level 19)开始支持Java 7,但...
    Pery_Zen阅读 4,439评论 0 2