fragmentについては、いろいろ実験内容をこのブログで記述しましたが、結局のところ、やる事は、メインのレイアウトにつける事と外す事が主な対応にはなりそうです。
fragmentの機能として、自分でやることが整理できていれば、自分でベースとなるインターフェースを作ってみるとよいかと思います。僕が作ったのを参考に書いてみます。
public interface BaseFragment { //戻るボタンを押した時のふるまいを書いておく。 public Boolean setClickReturnBtn(); //アプリを削除する時のインターフェース void callFinish(BaseCallback callback); interface BaseCallback{ void callbackFunction(); } }
こんな感じにしていますが、戻るボタンを押した時の動作とメインのアクティビティから削除の命令をされた時に、動作をする関数を用意しています。
MainActivity側
まずはレイアウト
<FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/frag" > </FrameLayout>
こんな感じにフラグメント置く場所をlayoutの中に配置をします。
FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); Fragment1 frag1 = new Fragment1(); fragmentTransaction.replace(R.id.frag, frag1); fragmentTransaction.commit();
これで設置ができます。
また、上書きをしたい時にも同じでreplaceでおくことができます。
この切り変えをactivity側で行う時に、切り替えモーションをつける場合にBaseFragmentにcallFinishをつけています。
Fragment側
public class mFragment extends Fragment implements BaseFragment{ public Boolean setClickReturnBtn(){ // return false; } private View rootView; private CallbackFunction callback; public mFragment(CallbackFunction _callback) { callback = _callback; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { rootView = inflater.inflate(R.layout.frag1, container,false); //イベントなど設定はここでいいかも。 return rootView; } @Override public void onDestroy() { rootView = null; callback = null; super.onDestroy(); } public interface CallbackFunction { public void callback(); } }
こんな感じにしています。fragment自体はcontainerがあるみたいなのですが、addViewとかで細かく対応するよりは、inflateでレイアウトをxmlから採用する方法を使っています。
setClickReturnBtnでbooleanで値を返すようにしているのですが
public boolean dispatchKeyEvent(KeyEvent event) { // TODO Auto-generated method stub if (event.getAction()==KeyEvent.ACTION_DOWN) { if(event.getKeyCode() == KeyEvent.KEYCODE_BACK) { FragmentManager fragmentManager = getFragmentManager(); BaseFragment frag = (BaseFragment)fragmentManager.findFragmentById(R.id.frag); if(frag != null){ if(frag.setClickReturnBtn()){ return false; } } } } }
mainactivity側でこんな感じに戻るボタンの判定をしたりに使ってはいたのですが、今のタイミングでは戻るボタンを効かないようにしたいタイミングがあったりすると思うのでbooleanで判定を返すしようにしておきました。
※BaseFragmentでinterfaceをつくっておけば、fragmentのクラスが何でも、basefragmentのsetClickReturnBtnを使えるので便利です。
あとはfragmentを上書きじゃなくて削除する場合は
FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.remove(fragmentManager.findFragmentById(R.id.frag)); fragmentTransaction.commit();
こんな感じにする事で、現在のフラグメントを削除する事ができます。