Fragment

Fragment

碎片是一种可以嵌在当前活动当中的UI片段,能让程序更加合理和充分利用空间,《Android编程权威指南》推荐开发最好使用碎片进行
在我的个人理解里面,碎片像是几个Layout的组合,就和Windows上我们经常在电脑屏幕上开多个窗口一样

碎片的使用

首先需要碎片布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:textSize="20sp"
        android:text="This is fragment"/>

</LinearLayout>

碎片的width和height虽然是match_parent,但是不会充满整个屏幕,因为它的父布局是Fragment控件

接下来创建Fragment类,为解决兼容性问题,通常继承support-v4库中的Fragment

public class mFragment extends Fragment {
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        return inflater.inflate(R.layout.fragment,container,false);
    }
}

在这个方法中,将R.layout.fragment动态加载进来了

在activity_main.xml中,fragment使用类似于其他控件

<fragment
        android:id="@+id/fragment"
        android:name="com.example.hermitgreen.fragmenttest.mFragment"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="match_parent"
        />

注意,碎片是必须配置name属性,显式指明要添加的碎片类名的

动态加载碎片

通常,若是需要动态加载碎片,通过FrameLayout来划分这片区域,因为FrameLayout不需要任何定位,很适合充满区域的碎片,注意FrameLayout不需要配置name属性

<fragment
        android:id="@+id/left_fragment"
        android:name="com.example.hermitgreen.fragmenttest.LeftFragment"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="match_parent"/>

<FrameLayout
        android:id="@+id/right_layout"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="match_parent">

</FrameLayout>

然后向FrameLayout中添加东西即可

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        replaceFragment(new mFragment());
    }

    private void replaceFragment(Fragment fragment){
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.replace(R.id.right_layout,fragment);
        transaction.addToBackStack(null);
        transaction.commit();
    }
}

replaceFragment()方法中,活动中可以通过getSupportFragmentManager()获得FragmentManager,然后调用FragmentManager的beginTransaction()开启一个事务,这个事务暂且就当作类似于Intent的东西吧!接下来类似于Intent的,对这个FragmentTransaction进行修改
replace()方法第一个参数是要加载的碎片布局,第二个参数是该碎片布局对应的类
addToBackStack(null)方法开启碎片的模拟返回栈,说人话就是让碎片可以类似于Layout一样返回上一页
最后用commit()方法提交事务

碎片与活动之间通信

在活动中可以调用碎片的方法,只需要利用FragmentManager的findFragmentById()方法

OtherFragment otherFragment = (otherFragment) getSupportFragmentManager().findFragmentById(R.id.other_fragment);

碎片中也可以调用活动的方法

MainActivity mainActivity = (MainActivity) getActivity();
posted @ 2020-04-06 22:15  HermitG  阅读(246)  评论(0编辑  收藏  举报