質問: rnd.nextInt(10); }else { //どうやって上のifで設定したrandの値を使う?? } ```
回答: 解決済の質問ですが、 * なぜ予期せぬ挙動をしたのか * なぜそれでうまくいくのか を中心に追記しておこうかと思います。 `Fragment`は、インスタンスです。インスタンスを生成しactivityから呼び出してから、`onCreate()` -> `onCreateView()`...のように順にライフサイクルイベントが呼び出されます。 以下で、質問者様のFragmentとstatic領域に関する知識となればいいと思い指摘させていただきます(もし既知でしたらスルーしてください。) > > Fragmentが読み込まれるたびに乱数が発生する。 > > > 「読み込まれる」というのは、インスタンスが初期化されるという意味では正しいです。`onCreateView()`は、タイミング的にはインスタンスがないもしくはすでに破棄されている状態からFragmentを生成したときに呼び出されます。ですので、`if-else`ブロックはFragmentが生成された最初しか呼び出されることはありません。 公式ドキュメントにも`onCreateView()`については以下のように書かれています。 > > フラグメントが初めてユーザー インターフェースを描画するタイミングでシステムがこれを呼び出します > > > これを踏まえると、`if-else`の中でelseの場合に値が0になっていることは正しい状態と言えます。なぜなら、初めて`onCreteView()`が呼ばれた段階でelseに入った場合はランダム数列を生成していないためです。 > > メンバ変数をstatic int rand;に変更したらうまくいく。 > > > これは、`static`修飾子を理解されるといいかと思います。`static`とは、「静的」という意味で、これをつけた変数などはプログラムがコンパイルされた時点でメモリを確保し、参照しているメモリは変更されることはありません。ですので、最初から最後まで同じ場所を参照しているわけです。 これを踏まえますと、一度このメモリに値が格納されれば、一度Fragmentが破棄されてもう一度`onCreateView()`が呼び出された場合でも、`static`修飾子がついている変数は同じメモリを参照しているので値が入った状態で再び得ることができるわけです。 `static`ではない場合は、参照しているメモリはその変数が呼び出されるたびに確保します。ですので、二度目に`onCreateView()`が呼ばれたときには別のメモリを参照し、一度目にいれたランダムな数列を得ることはできないのです。 と、以上私なりに説明しましたが、説明が下手もしくは誤解を生む表現もあるかもしれないので、様々な記事を参考になさってみてください。 * staticについて * ActivityとFragmentのライフサイクルについて * Fragmentの公式ドキュメント