Fragment的一個簡單實現+EditText的監聽事件
fragment是一種控制器,activity可委派它完成一些任務,通常是管理整屏或部分的使用者介面。
管理使用者介面的fragment又稱UI fragment
fragment檢視包含了使用者可互動的視覺化UI元素
用fragment來管理使用者介面,再用activity來託管fragment例項,activity靠FragmentManager來管理fragment
託管:actiivty在其檢視層級提供一處位置放置fragment的檢視。fragment本身不具有在螢幕上顯示檢視的能力
activity的任務:1,安排fragment檢視位置2,管理fragment生命週期
託管的兩種方式:1,在佈局中新增fragment(?)
將fragment及其檢視與activity的檢視繫結在一起,這 樣想要更改
fragment的話就得更改activity的檢視,就得重新onCreate activity
2,在activity中新增fragment
唯一可在執行時控制fragment的方式
FragmentActivity
public class CrimeActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_crime);
FragmentManager fragmentManager=getSupportFragmentManager();
Fragment fragment=fragmentManager.findFragmentById(R.id.fragment_container);
if (fragment==null){
fragment=new CrimeFragment();
fragmentManager.beginTransaction().add(R.id.fragment_container,fragment).commit();
}
}
}
FragmentManager類負責管理fragment並將它們的檢視新增到activity的檢視層級結構中,還負責呼叫fragment的生命週期方法
管理:1,fragment佇列2,fragment事務回退棧
activity被銷燬時,它的FragmentManager會將fragment佇列儲存下來,activity重建時,新的FragmentManager會首先獲取已儲存的fragment佇列,然後重建fragment佇列
FragmentManager fragmentManager=getSupportFragmentManager();
Fragment fragment=fragmentManager.findFragmentById(R.id.fragment_container);
if(fragment==null){
fragment=new CrimeFragment();
fragmentManager.beginTransaction().add(R.id.fragment_container,fragment).commit();
}
這段程式碼建立並提交了一個fragment事務
fragment事務被用來新增,移除,附加,分離,或替換fragment佇列中的fragment;FragmentManager管理者fragment事務回退棧
利用beginTransaction方法得到fragment佇列(FragmentTransaction),向佇列新增fragment,提交事務
fragmentManager.beginTransaction().add(R.id.fragment_container,fragment).commit();
add的兩個引數
資源ID的作用是:1,告訴FragmentManager,fragment的檢視應該出現在哪個位置2,用作佇列中fragment的唯一識別符號
獲取fragment時直接使用id即可
fragment=fragmentManager.findFragmentById(R.id.fragment_container);
Fragment
public class CrimeFragment extends Fragment {
private Crime mCrime;
private EditText mTitleField;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
mCrime=new Crime();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
View v=inflater.inflate(R.layout.fragment_crime,container,false);
mTitleField=(EditText)v.findViewById(R.id.crime_title);
mTitleField.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
mCrime.setTitle(s.toString());
}
@Override
public void afterTextChanged(Editable s) {
}
});
return v;
}
}
View v=inflater.inflate(R.layout.fragment_crime,container,false);
第二個引數是檢視的俯檢視,需要用父檢視來正確配置元件
第三個引數告知佈局生成器是否將生成的檢視新增給父檢視,此處傳入否,因為將以activity程式碼的方式新增檢視
要注意fragment的onCreate方法是公用的,而activity的這個方法是保護的
建立和配置fragment的檢視是在onCreateView裡完成的
onCreate裡配置了fragment例項(?是指資料的配置嗎)
新增fragment時,onAttach,onCreate,onCreateView會被呼叫
activity執行狀態執行時,相應方法會快速執行,以與activity同步
比起使用android系統內建的fragment,更推薦使用開發者庫的,這樣要使用新特性時,只需升級支援庫即可
兩個重要的支援庫類:Fragment FragmentActivity
使用fragment的前提是activity知道如何管理fragment,
FragmentActivity可以管理fragment