fragmentについては、いろいろ実験内容をこのブログで記述しましたが、結局のところ、やる事は、メインのレイアウトにつける事と外す事が主な対応にはなりそうです。 続きを読む…
fragmentについては、いろいろ実験内容をこのブログで記述しましたが、結局のところ、やる事は、メインのレイアウトにつける事と外す事が主な対応にはなりそうです。 続きを読む…
使い方をまとめました。こちらの記事は考察なども含まれてるので、簡潔に分かりたい場合はこちらを参照してください
なんとなく自分で作る用のメモ(パズドラみたいのを作る時のfragmentの設計みたいなもの)
と考えて、また取り外しにおいて要素をメモリ上から消すのも簡単。
で、作る時には
activityはフラグメントを入れる要素のみ配置する
っていうルールを自分で持ちます。
(ここも持たないで自分で作ってもいいけど、そうすると取り外し・重ね順が面倒なので、とりあえずは、このまま)
で対応をします。
-splashfragment -loadingfragment
時間の経過で、splashfragmentをreplaceでloadingfragmentに。
loadingfragmentの時、loadingの実態は、activityで実装して状態の変化をloadingfragmentに送るのみ。
loading終了したら、loadingfragmentをremoveで完了。とすると、同じactivity内だけど、fragmentで配置したものはメモリからも消してある。
-headerfragment -footerfragment -contentfragment
でここでは、各fragment毎にレイアウトで配置をする。
各フラグメントからの、ボタンクリックなどは、見た目の変更などを除いて、とりあえずactivityに持ってくる。
表示としては、contentfragmentだけ、0.1秒あとに読み込みでいいかなと。
contentfragmentはreplaceをして切り替えていくイメージ
-dialogfragment -loadingfragment -confirmfragment -errorfragment
とか前面で表示したいものは一括で用意をする。表示・非表示においては、自分で管理するが、ひとつのレイアウトに対してのreplaceをする事で、余計な事をしない用になりメモリの節約ができる
-gamefragment -gamesettingfragment
ゲームを実装する部分とゲーム以外を実装する部分で分けて実装をできるよ良い。
場合によっては1つのfragmentでもいいが、header footerを分けて実装でも問題はない。
タブのゲーム選択画面で設定していた要素については、すべて、removeしていると理想的。
ちょっと自分で作る用のメモなので、なんかわかりにくい感じですいません。
各fragmentを用いる事でactivityの遷移なしで、アプリが作れる感じになります。
使い方をまとめました。こちらの記事は考察なども含まれてるので、簡潔に分かりたい場合はこちらを参照してください
fragmentの中身が存在するときには、戻るボタンでfragmentをけして、存在しない時にアプリを終了させればいいやと思ったので、
Activityクラス内で
@Override public boolean dispatchKeyEvent(KeyEvent event) { if (event.getAction()==KeyEvent.ACTION_DOWN) { if(event.getKeyCode() == KeyEvent.KEYCODE_BACK) { FragmentManager fragmentManager = getFragmentManager(); if(fragmentManager.findFragmentById(R.id.root) != null){ フラグメント削除の記述 return false; } } } return super.dispatchKeyEvent(event); }
をしました。
特にアニメーションとかなく、消えてしまえばいいのであれば、
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.remove(fragmentManager.findFragmentById(R.id.frag)); fragmentTransaction.commit();
でいいです。前ページに戻るとかの設定も似た感じで対応できますね。
使い方をまとめました。こちらの記事は考察なども含まれてるので、簡潔に分かりたい場合はこちらを参照してください
数回にわたり、勉強をしてきたのですが、fragmentのページ遷移用テンプレートを作りました。
public class mFragment extends Fragment {
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();
}
}
を自分の中でテンプレートとして利用をしてみます。
他の人ので、はsaveInstanceに固有値を保持しておいて、戻ってきた時に、値が取り出せる。とか、そういうのが入っていたかと思うのですが、値の管理はActivityに任せる形を選択する事でfragment側は、割と簡易的に表示できたかと思います。
使い方をまとめました。こちらの記事は考察なども含まれてるので、簡潔に分かりたい場合はこちらを参照してください
fragment内から、findViewByIdを使う方法を調べたら、
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.frag1, container,false); rootView.findViewById(R.id.button1).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { } }); return rootView; }
みたいな解決方法が多々見受けられたのですが、これじゃ、ライフサイクル内部でしか参照できないじゃん。という、疑問が出てしまうのですが、結局なところ、使い易くする為には、
View rootView; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { rootView = inflater.inflate(R.layout.frag1, container,false); return rootView; }
とすると、rootViewがどこからでも参照可能。なので、これにしました。
で、ライフサイクルが存在してくれてるので、
@Override public void onDestroy() { rootView = null; super.onDestroy(); }
をしておけばメモリ的にも安心かと思います。