読者です 読者をやめる 読者になる 読者になる

AndroidのFragmentに関するメモ

Android開発のアンチパターンの最たる例が,
「責務を大量に抱えたActivity」
だと思う.
Androidにおいては,何をやるにしても
Activityオブジェクト(正確にはContextオブジェクト)を必要とされるので,
「じゃあ,もうActivityクラスに処理を全部書いちゃえば良いじゃん!」
となるのが,多分,その理由.

そこで登場するのが,今回のメインテーマであるFragmentクラス.
今までActivityが1人であれこれ頑張っていた諸々の責務を,
適切なサイズで切り出してしまおう,という発想.
まあ遥か昔から存在する概念なんだけど,今まで逃げていたので
そろそろ観念して勉強することにした,という話.

リファレンスは下記.
Fragment | Android Developers

onResume()だのonStart()だの,
Activityでよく見かけた記述が存在するのが見て取れる.
「あれ?setContentViewは?」となったけど,
そこはonCreateViewメソッドで対応する模様.
使い方としては以下のような感じ.

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_menu, container, false);
    return view;
}

操作対象のViewを探すためにfindViewByIdしたくなるけれど,
Fragmentには用意されていないので,
一度getActivity()メソッドを経由する必要がある.
例えば,スピナーの選択肢を更新したければ以下を実行する.

private void updateSpinner() {
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, android.R.layout.simple_spinner_item);
    adapter.add("晴れ");
    adapter.add("曇り");
    adapter.add("雨");
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    Spinner spinner = (Spinner) getActivity().findViewById(R.id.title_spinner1);
    spinner.setAdapter(adapter);
}

Activity上でFragmentを呼び出したいときは,
FragmentManagerなるクラスを使えば良い模様.
Activity上でgetSupportFragmentManager()メソッド
実行することで呼び出せる.
何度も使う処理なので,以下みたいにメソッド化した方が良いかも.

private void replaceContainer(int containerId, Fragment fragment) {
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(containerId, fragment);
    transaction.commit();
}

初歩の初歩だけど,とりあえずこの辺さえ押さえておけば,
Activityにゴリゴリ書いていた頃とほぼ同じ要領で,
かつ適度にコードを分割しながらプログラミング出来るようになるんじゃないかな.


そういえば新年初投稿でした.あけましておめでとうございます.