Fragment的初级使用手记

2017-08-15  本文已影响0人  TakeItEasyJQ

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

发现可以达到预期效果

如有错误欢迎指正

结束

上一篇 下一篇

猜你喜欢

热点阅读