2011-02-10 11 views
0

これは不安な質問だと思いますが、私は適切な課題を構成することさえできません!ここで私は、Androidの下でやろうとしているものです:UI関連オブジェクトはどれくらいの期間使用可能ですか?

ここ
public void onCreate(Bundle savedInstance) { 
    ... 
    AskFilename ask = new AskFilename(); 
    ... 
} 

AskFilenameクラスは、ユーザーがファイル名を入力できるようにするユーザ・インタフェースを提示します。ただし、onCreate()メソッドが返されると、askオブジェクトは有効範囲外になります。これは、askへの参照がなくなることを意味します(AskFilenameクラス内で、他の変数にポインタを割り当てませんでした)ので、GCは遅かれ早かれそれを "収集"します。これが発生した場合、ユーザがダイアログボックスをOKにしていないと、AskFilenameのコードはすでに使用できなくなり、システムがクラッシュします。私の理解は正しいのですか?

(私はGCをどのようにして仕事をさせるかわからないので、このアイデアで実験する方法は考えられません.GCが望むときだけGCが始まるようです! )それは仕事をしますか?

上記が正しい場合、UI関連オブジェクトを新規作成する適切な方法は何ですか?私はAskFilename静的にevrythingすることができますか、または私はask静的な移植可能なことができ、それが完了したらnullに割り当てることができます。しかし、他の方法はありますか?あるいは、アイデアそのものがまず悪いですか?

(AskFilenameがMyActivite.AskFilename気に入りましたか?活動の「内部」クラスであれば、それはすべての違いを生むん。)

事前にありがとうございます。

答えて

2

まず、宣言をメソッド宣言の外に、つまりクラスのメンバとしてAskFilename ask;に入れるだけです。次に、onCreateメソッドでask = new AskFilename();で初期化します。

しかし、知っていることは、コンストラクタがおそらくそのようには見えないことです。すべてのAndroid UIコンポーネントには、それを含むものへのコールバック(参照)が含まれています。これは通常、Contextをアクティビティ内のUIコンポーネントのコンストラクタに渡すことで行います。コンテキストは通常​​はアクティビティ自体であるため、というキーワードを使用します。例えば:

TextView tv = new TextView(this);

あなたAskFilenameダイアログを構築しかし、私はあなたがそのコンポーネントにコンテキストを伝承する必要があります期待しています。だからあなたのコンストラクタは、おそらくコンテキスト引数を取る必要があります。

ask = new AskFilename(this); 

また、あなたの活動は、そのUIコンポーネント、およびダイアログのすべてに(暗黙的に)参照を保持することがonCreateDialog()だからあなたのオブジェクトが選んだ得ることはありませんと表示さGCによる setContextViewを呼び出すかダイアログを作成するときに、これらの参照を取得します。

+0

ありがとうございます!はい、あなたが言ったように、私はコンストラクタのActivityへの参照が必要です。議論のために、これは、すべてのUIビューAskFilenameがアクティビティへの参照を作成し、AskFilenameを持たないことを保証するだけです。つまり、この場合、AskFilenameはまだ孤立しています(あなたが提案したアクティビティのクラスメンバーに「質問」していないとすれば、私にとってはうまくいきます)。私は正しい? – wwyt

+0

おそらく実際には、setContentViewを呼び出して(何らかの形で)、既存のレイアウトにアタッチしたり、ダイアログとして作成して表示させたりすると、画面に表示させることができます。オブジェクトへの参照。 – Jems

関連する問題