Fragment間の切り替え、「ジャンプ」.


Fragmentはactivityインタフェースの一部であり、独立して存在することはできず、activityに埋め込まなければならず、fragmentのライフサイクルはactivityの影響を受けている.したがってfragment間ではactivityのように直接ジャンプすることはできません.しかし,コールバック関数によりactivityでfragmentの切り替えを制御し,fragment間の直接ジャンプのような機能を実現することができる.
ジャンプが必要なfragmentでコールバックインタフェースを実装し、プライマリactivityに実装するように要求します.activityがこのインタフェースを介してコールバックを受けると、切り替えられたインタフェースを制御する.
 
/**
 * 
 *
 * @author hx
 * @version 2014-12-01
 *
 */
public class DemoFragment extends Fragment{
	
	DemoFragmentSelectedListener mCallback;
	
	// , 
	public interface DemoFragmentSelectedListener {
        public void onArticleSelected(int position);
    }
    
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        //  activity 
        //  。 , 
        try {
            mCallback = (DemoFragmentSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement OnHeadlineSelectedListener");
        }
    }

// , mCallback.onArticleSelected() 。
}

メインactivityでのインタフェースの実装:
/**
 * 
 *
 * @author hx
 * @version 2014-12-01
 *
 */
public class MainActivity extends Activity 
						implements DemoFragment.DemoFragmentSelectedListener{
	
	
    // searchFragment , 
	@Override
	public void onArticleSelected(int position) {
		// TODO Auto-generated method stub
		
		
		DemoFragment1 newFragment = new DemoFragment1();
        Bundle args = new Bundle();
        args.putInt("position", position);
        newFragment.setArguments(args);// 
    
        android.app.FragmentTransaction transaction = getFragmentManager().beginTransaction();
        transaction.replace(R.id.content_frame, newFragment);// 
        transaction.addToBackStack(null);

        transaction.commit();
		
	}
    
}

 
ジャンプ先のDemoFragment 1でパラメータを受信します.
/**
 * 
 *
 * @author hx
 * @version 2014-12-01
 *
 */
public class DemoFragment1 extends Fragment{
	
	public void onCreate(Bundle savedInstanceState){
		super.onCreate(savedInstanceState);
		// DemoFragment 。
		int position = (Integer) getArguments().get("position");
	}

}