碎片的生命週期
1.運行狀態:可見,並且能交互
2.暫停狀態:可見,不能交互
3.停止狀態:不可見,很可能被系統回收。(出現的情況:1.activity進入停止狀態。2.在通過調用remove/repalce方法將碎片從活動中移除,但在commit之前調用了addToBackStack)
4.銷燬狀態:不可見 (出現情況:activity被銷燬時,或調用remove/repalce方法將碎片從活動中移除,但在commit之前沒有調用addToBackStack。)
使用
方法一:直接寫在xml文件中
1.定義fragment的佈局名爲:left_layout
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:text="leftFragment" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>2.在定義的fragment裏面引用佈局
public class LeftFragment extends Fragment { /** * 當碎片和activity建立關聯的時候 * @param context */ @Override public void onAttach(Context context) { super.onAttach(context); } /** * 當碎片創建試圖時(加載佈局的時候調用) * @param inflater * @param container * @param savedInstanceState * @return */ @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.left_layout, container, false); return view; } /** * 確保與碎片相關的activity一定已經創建完畢的時候調用 * @param savedInstanceState */ @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); } /** * 當碎片關聯的試圖被移除的時候調用 */ @Override public void onDestroyView() { super.onDestroyView(); } /** * 當碎片和activity解除關聯的時候調用 */ @Override public void onDetach() { super.onDetach(); } /** * 防止被系統回收存儲一些數據,通過bundle存儲下來。可以在onCreateView()或者 * onActivityCreated()或者onCreat的bundle中取到值。 * @param outState */ @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); } }3.定義一個activty
public class FragmentActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fragment); } }4.在activty的xml佈局中引用fragment
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_fragment" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.lvyequeen.test.day01.fragment.FragmentActivity"> <fragment android:name="com.lvyequeen.test.day01.fragment.LeftFragment" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" /> </LinearLayout>
方法二:動態添加碎片
1.像上面一樣簡單創建兩個fragment 名爲:RightFragment 和 AnotherFragment
2.創建一個activty
public class FragmentActivity extends AppCompatActivity implements View.OnClickListener { private Button leftButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fragment); initView(); repalceFragment(new RightFragment()); } private void initView() { leftButton = ((Button) findViewById(R.id.leftButton)); leftButton.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.leftButton: repalceFragment(new AnotherFragment()); getFragment(); break; } } /** * 替換fragment * * @param fragment */ private void repalceFragment(Fragment fragment) { // 獲取FragmentManager FragmentManager manager = getSupportFragmentManager(); manager.findFragmentById(R.id.right_Layout); // 開啓一個事物 FragmentTransaction transaction = manager.beginTransaction(); // 向容器內添加或替換碎片,一般用replace 參數1:傳入容器的id,參數2:待添加的fragment實例 transaction.replace(R.id.right_Layout, fragment); // 在碎片中模擬返回棧,點擊回退鍵回到上一個fragment transaction.addToBackStack(null); // 提交事物 transaction.commit(); } /** * 獲取fragment的實例 */ private void getFragment() { // 獲取FragmentManager FragmentManager manager = getSupportFragmentManager(); // 獲取fragment的實例 RightFragment rightFragment = (RightFragment) manager.findFragmentById(R.id.right_Layout); rightFragment.testContectWithActivity(); } }3.佈局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_fragment" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.lvyequeen.test.day01.fragment.FragmentActivity"> <fragment android:name="com.lvyequeen.test.day01.fragment.LeftFragment" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" /> <FrameLayout android:id="@+id/right_Layout" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" /> </LinearLayout>
三 動態加載佈局的技巧(區分平板和手機)
1.使用限定符
在res文件夾下創建一個layout-large文件夾寫一個和activity引用原先layout文件一樣名稱的xml佈局。屏幕被認爲是large的設備就會加載layout-large文件夾裏面的文件。
2.使用最小寬度限定符
在res文件夾下創建一個layout-sw600dp文件夾。和上面一樣。當程序運行在屏幕寬度大於600dp的設備上時加載layout-sw600dp裏的佈局,小於時,加載默認layout裏面的佈局。
使用注意事項