1. 程式人生 > >Fragment的一個簡單實現+EditText的監聽事件

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