Fragment間の切り替え、「ジャンプ」.
2608 ワード
Fragmentはactivityインタフェースの一部であり、独立して存在することはできず、activityに埋め込まなければならず、fragmentのライフサイクルはactivityの影響を受けている.したがってfragment間ではactivityのように直接ジャンプすることはできません.しかし,コールバック関数によりactivityでfragmentの切り替えを制御し,fragment間の直接ジャンプのような機能を実現することができる.
ジャンプが必要なfragmentでコールバックインタフェースを実装し、プライマリactivityに実装するように要求します.activityがこのインタフェースを介してコールバックを受けると、切り替えられたインタフェースを制御する.
メインactivityでのインタフェースの実装:
ジャンプ先のDemoFragment 1でパラメータを受信します.
ジャンプが必要な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");
}
}