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放在頂層
先總結這麼多,日後再進行補充