美文网首页
Fragment的初级使用手记

Fragment的初级使用手记

作者: TakeItEasyJQ | 来源:发表于2017-08-15 10:48 被阅读0次

    这只是我在学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;
        }
    }
    

    发现可以达到预期效果

    如有错误欢迎指正

    结束

    相关文章

      网友评论

          本文标题:Fragment的初级使用手记

          本文链接:https://www.haomeiwen.com/subject/silmrxtx.html