Fragment学習

3839 ワード

1.Fragmentロールバックスタック管理


Activityはタスクスタックによって管理され、先進的な後出の原則に従い、Fragmentも同様のスタック管理を実現することができ、それによって複数のFragmentが前後して追加された後に前のFragmentに戻ることができ、activityコンテナ内にFragmentがない場合に戻るとActivityを終了する.具体的な方法:FragmentTransaction.addToBackStack(String)/通常nullに入力するコードは以下の通りです.
Fragment f = new Fragment();  
FragmentManager fm = getSupportFragmentManager();  
FragmentTransaction ftx = fm.beginTransaction();  
ftx.replace(R.id.fragment_container, f, "tag");  
ftx.addToBackStack(null);  
ftx.commit();

注意:1.Activityの最初のFragment(ルートFragment)は、最後のFragmentが戻るときに空白ではなくactivityを直接終了するように、ロールバックスタックを追加しないことができます.2.addToBackStack(null)を呼び出すと、現在のトランザクションがロールバックスタックに追加され、replaceメソッドを呼び出すとFragmentインスタンスは破棄されませんが、ビュー階層は破棄され、onDestoryViewとonCreateViewが呼び出されます.現在のfragmentビューの状態を保存するには、hide後addの新しいFragmentを使用します.

2、FragmentとActivity通信


一般的な方法:


Activity呼び出しFragmentメソッド:Activityに自己管理のFragmentの参照が含まれている場合は、参照によってすべてのFragmentに直接アクセスできるpublicメソッドFragmentによってActivityメソッドを呼び出す:FragmentでgetActivityによって現在バインドされているActivityのインスタンスを取得し、操作を行う

推奨方法:


1.インタフェース(FragmentはActivity)Fragment部分コードにデータを返す:
public class TestFragment extends Fragment {

    private OnSaveListener listener;

    public void setListener(OnSaveListener listener) {
        this.listener = listener;
    }

    public interface OnSaveListener {
        void onSaveFinished(boolean result);

        void onSaveStart();
    }


    @OnClick(R.id.btn_save)
    public void save() {
        ....
        listener.onSaveFinished(true);
    }
}

Activity部分コード:
TestFragment f = new TestFragment();
f.setListener(new ShowCheckFragment.OnSaveListener() {

    @Override
    public void onSaveFinished(boolean result) {
        ......
    }

    @Override
    public void onSaveStart() {
        ......
    }
});

FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.fragment_container, f);
fragmentTransaction.commit();

2.Fragment Arguments(Fragmentにデータを渡す)Fragment部分コード:
ublic class TestFragment extends Fragment  
{  

    private String mArgument;  
    public static final String ARGUMENT = "argument";  

    @Override  
    public void onCreate(Bundle savedInstanceState)  
    {  
        super.onCreate(savedInstanceState);   
        Bundle bundle = getArguments();  
        if (bundle != null)  
            mArgument = bundle.getString(ARGUMENT);  

    }  

    /** 
     *  , arguments 
     * @param argument 
     * @return 
     */  
    public static TestFragment newInstance(String argument)  
    {  
        Bundle bundle = new Bundle();  
        bundle.putString(ARGUMENT, argument);  
        TestFragment f = new TestFragment();  
        f.setArguments(bundle);  
        return f;  
    }

3、Fragment重複問題


スクリーンの回転やメモリの再起動(Fragmentおよびコンテナactivityがシステムによって回収されてから開くと再初期化)は、activity自体が再起動されるとFragmentが復元され、Fragmentのコードが作成されて新しいFragmentが作成されるため、Fragmentが重なる問題を引き起こします.解決方法:onCreateメソッドでパラメータBundle savedInstanceStateを判断し、空の場合にFragmentインスタンスを初期化し、その後、FragmentでonSaveInstanceStateのメソッドでデータActivityコードを復元します.

private TestFragment f;

protected void onCreate(Bundle savedInstanceState)  
    {  
        super.onCreate(savedInstanceState);    
        setContentView(R.layout.activity_main);  

        Log.e(TAG, savedInstanceState+"");  

        if(savedInstanceState == null)  
        {  
            f = new TestFragment();  
            FragmentManager fm = getSupportFragmentManager();  
            FragmentTransaction tx = fm.beginTransaction();  
            tx.add(R.id.id_content, f, "ONE");  
            tx.commit();  
        }  



    }