安卓Fragment相關知識點詳解(面試必問!!!)

Fragment面試詳解

一.添加fragment到Activity的兩種方法


.

1.靜態添加Fragment到Avtivity:

1.1編寫xml佈局文件
2.編寫java類繼承Fragment類
3.在剛纔編寫的java類中重寫onCreateView方法,然後利用

 View view = inflater.inflate(R.layout.xxx,null);

獲取到view對象,然後通過findViewById方法找到對應的控件進行操作。

2.動態添加Fragment到Activity

1.創建容器Activity,並設置佈局容器標識位。

<?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=".Activity3">

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

2.和靜態加載加載一樣,編寫Fragment.
3.在Avtivity中:

public class Activity3 extends AppCompatActivity {

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

        //獲取FragmentManager,在Avtivity中與Fragment進行交互
        FragmentManager fragmentManager = getSupportFragmentManager();
        //開啓事務
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

        //獲取Fragment對象
        Static_fragment static_fragment = new Static_fragment();
        //將對象裝填到目標容器中
        fragmentTransaction.add(R.id.fragment_up,static_fragment,"fragment_up");
        fragmentTransaction.addToBackStack("fragment_up");


        Fragment_down fragment_down = new Fragment_down();
        
        //創建bundle對象
        Bundle bundle = new Bundle();
        //放入參數
        bundle.putString("key","123");
        static_fragment.setArguments(bundle);
        fragmentTransaction.add(R.id.fragment_down,fragment_down,"fragment_down");
        //將此fragment加入到回退棧
        fragmentTransaction.addToBackStack("fragment_down");

        //提交事務
        fragmentTransaction.commit();
    }
}

二.FragmentPagerAdapter與FragmentStatePagerAdapter的區別

1.FragmentPagerAdapter:適用於頁面較少的情況

2.FragmentStatePagerAdapter:適用於頁面較多的情況

原因:
在兩個Adapter的源碼中,都有destoryItem()方法。
在FragmentStatePagerAdapter的destoryItem()方法中,調用了fragmentTransaction 的remove()方法,真正釋放了fragment的內存,說明它更加節省內存。

在FragmentPagerAdapter的destoryItem()方法中,調用了fragmentTransaction 的detach()方法,是將Activity的UI和Fragment的UI脫離,並不釋放內存。

三.Fragment的生命週期

結合activity的生命週期:
在這裏插入圖片描述

四.Fragment與Activity通訊

1.Fragment調用父Activity的方法:
1.1獲取activity對象

  Activity2 activity2 = (Activity2) getActivity();
  activity2.spell("lili");

1.2利用接口回調

 //在Fragment中聲明一個接口
 public  interface SpeakListener
    {
        void speak(String value);
    }

,然後讓Activity實現這個接口,並且重寫speak方法。我們可以在speak方法中調用我們自己avtivity的方法。
然後在

 // Fragment中聲明接口變量
    SpeakListener speakListener;

    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        if (context instanceof  Activity2)
        {
            this.speakListener = (SpeakListener) context;
        }
    }

//Fragment調用接口的方法
 speakListener.speak("123456");

我們activity中的接口就會被回調,完成Fragment調用Activity的方法。

2.Activity調用fragment的方法:

2.1直接獲取fragment對象:

//       1.靜態id查找
        Fragment fragment=getFragmentManager().findFragmentById(R.id.ll_fragment);
//       2. 動態tag查找
        Fragment fragmentTag=getFragmentManager().findFragmentByTag("fragment_tag");

2.2
利用接口

3.Fragment調用Fragment中的方法

同2.1

4.傳遞參數:
可以利用bundle,在Activity中,利用fragment的setArguments(bundle)傳到fragment,在fragment中,用getArguments接收

五.Fragment的replace()與add()的區別

replace()方法是替換頂層的fragment
add()是將一個fragment放在頂層

先總結這麼多,日後再進行補充

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章