質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

2回答

572閲覧

androidでメンバ変数の値を途中から変更したい

po_tato

総合スコア97

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2017/09/08 07:31

編集2017/09/08 08:08

すごく初歩的なものかもしれませんが、質問させていただきます。

下記のようなソースコードがあり、最初のifの中でメンバ変数の値を
0からランダムな数に設定するとして次のelseの中でも使いたいのですが、
0が取得されてしまいます。どうすれば設定した値を取得できるでしょうか?
なお、メンバ変数のランダムな数の設定は最初のifの中で行うもとします。

public class uFragment extends Fragment { int rand; public LpFragment() { // Required empty public constructor } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View view = inflater.inflate(R.layout.ufragment, container, false); if (Arrays.equals(stat,zeroarray)){ Random rnd = new Random(); this.rand = rnd.nextInt(10); }else { //どうやって上のifで設定したrandの値を使う?? }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LouiS0616

2017/09/08 08:16 編集

乱数の代入をif文の中でしなければならない理由がわかりません。どうしてこのような制約が生じるのでしょう? ※的外れでした。すみません。
po_tato

2017/09/08 07:46

乱数を発生させるのはこのif分の条件に合ったときに初めて発生し、それ以降発生して欲しくないからです。ifの外に記載するとこのfragmentが読み込まれるたびに乱数が発生しませんか?
LouiS0616

2017/09/08 07:51

すみません、私はAndroidには詳しくないのですが、if文の中で使い捨てるufを宣言する意味がよくわかりません。this.rand = rnd.nextInt(10);でいけない理由はなんでしょう?
po_tato

2017/09/08 08:07

はい。すみませんそれでもいいと思います。というかその方がいいと思います。そのように変えたとして、elseで同じようにthis.randを使おうとすると0になるんですがどうすれば。。
LouiS0616

2017/09/08 08:12

何回試しても0ですか?
po_tato

2017/09/08 08:13

はい。何回試してもです。
LouiS0616

2017/09/08 08:18

if文の中に処理が及んでいることは確かめられていますか?
po_tato

2017/09/08 08:21

はい。logに出して確認しております。ifの最初の条件下ではランダムな数がlogに表示されているのですが、elseの条件下では0です。
LouiS0616

2017/09/08 08:29

なるほど。ひとまず、私に思い当たる原因はもうありません。立て続けな質問失礼しました。
po_tato

2017/09/08 08:39

メンバ変数をstatic int rand;に変更したらうまくいきました!
guest

回答2

0

解決済の質問ですが、

  • なぜ予期せぬ挙動をしたのか
  • なぜそれでうまくいくのか

を中心に追記しておこうかと思います。

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()が呼ばれたときには別のメモリを参照し、一度目にいれたランダムな数列を得ることはできないのです。


と、以上私なりに説明しましたが、説明が下手もしくは誤解を生む表現もあるかもしれないので、様々な記事を参考になさってみてください。

投稿2017/09/08 11:35

hiramekun

総合スコア428

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

po_tato

2017/09/11 02:03

とても分かりやすく、 親切丁寧にお教えして頂き本当にありがとうございます! 勉強になりました! これからもより深いところまで理解できるように頑張ります!
guest

0

自己解決

メンバ変数をstatic int rand;に変更したらうまくいきました!

投稿2017/09/08 08:40

po_tato

総合スコア97

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問