這只是我在學Android過程中對于所學知識的鞏固和方便日后查詢的學習筆記往枷,能幫助到有需要的和我一樣的初學者就更好了
強烈建議使用V4庫中的Fragment來達到更好的兼容性
使用時只需新建MyFragment繼承Fragment而昨,并重寫View onCreateView()來動態(tài)加載即可
首先
<fragment
android:id="......"
android:name="......"
//也就是MyFragment(完整包名+類名,類似:com.example.Test.MyFragment)
......
/>
其次
public class MyFragment extends Fragment{
@override
public View onCreateView(LayoutInflater inflater ,ViewGroup container ,Bundle savedInstanceState){
View view=inflater.inflate(R.layout. ... ,container,false);
return view;
}//Fragment中的UI控件也加在與此方法中
}
就這么簡單
Fragment的替換(配合FrameLayout)
要注意
Fragment的替換并不是兩個Fragment相互替換,而是去替換空白的FrameLayout
**<FrameLayout id="@+id/frame_layout" />
假設 有兩個id分別為fragment1璧针,fragment2的碎片
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
@override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button=(Button)findViewById(R.id.changefragmen);
button.setonClickListener(this);
replaceFragment(new Fragment1());
}
@override
public void onClick(View v){
switch (v.getId()){
case R.id.changefragment:
replaceFragment(new Fragment2());
break;
default:
break;
}
}
private void replaceFragment(Fragment fragment){
//替換的相關代碼
FragmentManager manager=getSupportFragmentManager();
FragmentTransaction transaction=manager.beginTransaction();
transaction.replace(R.id.frame_layout ,fragment);//后者替換前者
//可以看出并非fragment2替換了fragment1
//而是代替了fragment1去替換frame_layout
transaction.commit();
}
}
與Activity的通信
引用了Fragment的Activity中獲取Fragment實例
MyFragment fragment=(MyFragment)getSupportManager().findFragmentById(R.id.fragment);
Fragment要使用Context對象時getActivity()即可
Fragment中獲取Activity對象
MainActivity activity=(MainActivity)getActivity();
Fragment間通信
先獲取另一碎片所屬活動的實例再由上面方法即可獲取碎片實例
生命周期
onAttach() onCreate() onCreateView() onActivityCreated
onStart() onResume() onPause() onStop()
onDestroyView() onDestroy() onDetach()
注意事項
1、fragment是可以加入返回桟的從而達到back鍵回到替換前的fragment而不是退出應用
只需在 transaction.commit();前addToBackStack(null);
.......
transaction.addToBackStack(null);//參數(shù)為一個用于描述返回棧狀態(tài)的名字
transaction.commit();
2疆股、很多時候一切設置妥當?shù)沁\行時報有關fragment的錯:
我遇到此問題時一般都是由于很少用到id锅必,所以<fragment >中沒有設置id這個屬性,設置后就正常了氢卡,別的問題還沒遇到
3锈至、引入Fragment時右側預覽總是報錯而且無法正常顯示Fragment,但是運行起來沒問題译秦,我也不知道原因
補充
有些情況下需要將繼承了SurfaceView的類加載于Fragment中峡捡,例如MySurfaceView击碗。加載至Activity中時
setonContentView(new MySurfaceView());
當時要加載到Fragment中時我卻不知該怎么辦,后來看Activity中的加載方法聯(lián)想到Fragment中和View有聯(lián)系的方法中加載是否可行们拙。
于是
public class MyFragment extends Fragment{
@override
public View onCreateView(LayoutInflater inflater ,ViewGroup container ,Bundle savedInstanceState){
View view=new MySurfaceView();
return view;
}
}
發(fā)現(xiàn)可以達到預期效果
如有錯誤歡迎指正