安卓開發--探究碎片Fragment
簡述:
最近做開發的時候又遇到了Fragment,發現太久沒寫,都快忘了,就抓緊寫個筆記(我太懶的了233)
Fragment可以簡單的看成迷你的活動,它和活動一樣都有佈局和生命週期,它可以嵌入活動之中,
這樣在活動的這個大布局中,還可以嵌入碎片的佈局,那麼app的功能就可以多樣化,實現碎片的方式也
很簡單,因為碎片是個迷你的活動,那麼肯定得和活動一樣,搭配一個佈局檔案,所以做法是先建立
對應碎片的佈局檔案,然後新建碎片類繼承Fragment類,把碎片佈局載入進來,然後再把這個碎片
載入到對應我們想要嵌入的活動中,因為碎片表現形式還是佈局,所以我們是在活動的佈局檔案中
加入碎片,載入碎片的。
0x01:簡單使用
新建兩個佈局檔案,Left_fragment和Right_fragment.xml,
<?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"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button" android:layout_gravity="center_horizontal" android:text="Button"/> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:background="#00ff00" 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 right fragement"/> </LinearLayout>
然後新建兩個碎片類,繼承Fragment,
package com.example.coolweather; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import androidx.fragment.app.Fragment; public class LeftFragment extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle saveInstanceState) { View view=inflater.inflate(R.layout.left_fragment,container,false); return view; } }
package com.example.coolweather; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import androidx.fragment.app.Fragment; public class RightFragment extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view =inflater.inflate(R.layout.right_fragment,container,false); return view; } }
重寫一個Fragment類中的onCreateView方法,通過inflater.inflate載入碎片的佈局,
然後最後就是將碎片嵌入到我們想要的活動之中(以佈局的形式,所以還是在xml檔案中加入)
<?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"> <fragment android:id="@+id/left_fragment" android:name="com.example.coolweather.LeftFragment" android:layout_width="0dp" android:layout_weight="1" android:layout_height="match_parent" /> <fragment android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:id="@+id/right_fragment" android:name="com.example.coolweather.RightFragment" /> </LinearLayout>
然後開啟模擬器就可以看到對應的效果了。
二.動態新增碎片,
新建另一個碎片佈局檔案,並建立碎片類,載入碎片佈局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:orientation="vertical" android:background="#ffff00" 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 another right fragment" /> </LinearLayout>
package com.example.coolweather; import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import java.nio.channels.InterruptedByTimeoutException; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.layout); Button button=(Button)findViewById(R.id.button); button.setOnClickListener((View.OnClickListener) this); } public void onClick(View v) { switch(v.getId()) { case R.id.button: replaceFragment(new AnotherRightFragment()); break; default: } } private void replaceFragment(Fragment fragment) { FragmentManager fragmentManager=getSupportFragmentManager(); FragmentTransaction transaction=fragmentManager.beginTransaction(); transaction.replace(R.id.right_layout,fragment); transaction.commit(); } }
replacefFragment這個方法是動態載入碎片的關鍵,先是呼叫getSupportFragmentManager()這個方法
返回FragmentManager物件,再通過FragManager物件呼叫beginTransaction開啟事務,然後呼叫
replace方法,第一個引數是容器的id,第二個引數是碎片的例項,就可以了,執行程式碼就有效果出現了。
另外如果需要點選back按鈕返回到上一個碎片的,話要額外再加一句程式碼,在replaceFragment中多加
一句就好了。
private void replaceFragment(Fragment fragment) { FragmentManager fragmentManager=getSupportFragmentManager(); FragmentTransaction transaction=fragmentManager.beginTransaction(); transaction.replace(R.id.right_layout,fragment); transaction.addToBackStack(null) transaction.commit(); }