Bootstrap

Fragment简单使用


前言

简单记录一下Fragment的使用


提示:以下是本篇文章正文内容,下面案例可供参考

一、Fragment使用场景

Android运行在各种各样的设备中,有小屏幕的手机,还有大屏幕的平板,电视等。同样的界面在手机上显示可能很好看,在大屏幕的平板上就未必了,手机的界面放在平板上可能会有过分被拉长、控件间距过大等情况。针对屏幕尺寸的差距,Fragment的出现能做到一个App可以同时适应手机和平板。这就是为什么要有Fragment的原因。

二、Fragment主要特点

Fragment是一种可以嵌入在Activity当中的UI片段。
 用来组建Activity界面的局部模块, 也可以说一个Actiivty界面可以由多个Fragment组成。
 其行为与Activity很相似, 有自己对应的布局(包含具体的View), 它有自己的生命周期,接收自己的输入事件,并且可以从运行中的activity中添加或移除。
 一个fragment必须总是嵌入在一个activity中,同时fragment的生命周期受activity的影响。

优势:

模块化:我们不必把所有代码全部写在Activity中,而是把代码写在各自的Fragment中。

可重用:多个Activity可以重用一个Fragment。

可适配:根据硬件的屏幕尺寸、屏幕方向,能够方便地实现不同的布局,这样用户体验更好。

三、Fragment与Activity通信

  • Activity–>Fragment: 在Activity中创建Bundle数据包,并调用Fragment的setArguments(Bundle bundle)方法
  • Fragment–>Activity:需要在Fragment中定义一个内部回调接口,再让包含该Fragment的Activity实现该回调接口。这样Fragment可调用该回调方法将数据传递给Activity

四、Demo所涉及的部分代码

1.MainActivity的布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">
    <Button
        android:id="@+id/change_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="change" />
    <Button
        android:id="@+id/replace_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="replace" />
    <FrameLayout
        android:id="@+id/framelayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/cardview_light_background"></FrameLayout>
</LinearLayout>

2.fragment_blank1的布局文件

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".BlankFragment1">

    <!-- TODO: Update blank fragment layout -->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="fragment1" />

</FrameLayout>

3.fragment_blank2的布局文件

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".BlankFragment1">

    <!-- TODO: Update blank fragment layout -->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="fragment2" />

        <Button
            android:id="@+id/btn1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="传递msg到Activity" />

        <Button
            android:id="@+id/btn2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="从Activity获取msg" />
    </LinearLayout>
</FrameLayout>

4.MainActivity的代码

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private Button change_btn;
    private Button replace_btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }
    private void initView(){
        change_btn = findViewById(R.id.change_btn);
        replace_btn = findViewById(R.id.replace_btn);
        change_btn.setOnClickListener(this);
        replace_btn.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.change_btn:
            	Bundle bundle = new Bundle();
                bundle.putString("msg","i am from MainActivity");
                BlankFragment1 blankFragment1 = new BlankFragment1();
                blankFragment1.setArguments(bundle);
                replaceFragment(blankFragment1);
                //replaceFragment(new BlankFragment1());
                break;
            case R.id.replace_btn:
                BlankFragment2 blankFragment2 = new BlankFragment2();
                blankFragment2.setFragmentCallBack(new FragmentCallBack() {
                    @Override
                    public void sendMsgToActivity(String msg) {
                        Log.e("MainActivity",msg);
                    }

                    @Override
                    public String getMsgFromActivity(String msg) {
                        Log.e("MainActivity",msg);
                        return "从Activity获取的msg";
                    }
                });
                replaceFragment(blankFragment2);
                break;
        }
    }

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

5.BlankFragment1的代码

public class BlankFragment1 extends Fragment {
    private View root;

	@Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Bundle bundle = getArguments();
        String msg = bundle.getString("msg");
        Log.e("BlankFragment1",msg);
    }
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        if (root == null){
            root = inflater.inflate(R.layout.fragment_blank1, container, false);
        }
        return root;
    }
}

5.BlankFragment2的代码

public class BlankFragment2 extends Fragment {
    private View blankView;
	private FragmentCallBack fragmentCallBack;
    public void setFragmentCallBack(FragmentCallBack callBack){
        fragmentCallBack = callBack;
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        if (blankView == null){
            blankView = inflater.inflate(R.layout.fragment_blank2, container, false);
        }
        Button btn1 = blankView.findViewById(R.id.btn1);
        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                fragmentCallBack.sendMsgToActivity("msg from fragment2");
            }
        });
        Button btn2 = blankView.findViewById(R.id.btn2);
        btn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String msg = fragmentCallBack.getMsgFromActivity("test");
                Log.e("BlankFragment2",msg);
            }
        });
        return blankView;
    }
}

6.FragmentCallBack的代码

public interface FragmentCallBack {
    void sendMsgToActivity(String msg);
    String getMsgFromActivity(String msg);
}

;