2013-08-09 8 views
8

フラグメントのコンテキストの使用に関する質問があります。私の問題は、私は常にNullpointerExceptionを取得することです。ここで私は何ですか:私のFragmentの私のコンテキストはなぜヌルですか?

SherlockFragmentを拡張するクラスを作成します。このクラスでは、私は別のヘルパークラスのインスタンスを持っている:ここでは

public class Fragment extends SherlockFragment { 
    private Helper helper = new Helper(this.getActivity()); 

    // More code ... 
} 

は、他のヘルパークラスの抽出物である:私は()などcontext.getResources()context.someMethodを呼び出す

public class Helper { 
    public Helper(Context context) { 
     this.context = context; 
    } 
    // More code ... 
} 

毎回私が得ますNullPointerException何故ですか?

+0

フラグメントを初期化するときに 'SherlockFragment#activity'のように見えますが、後のフェーズで注入されるので、コンストラクタで' null'となります。 –

答えて

16

。当時、Activityには添付されていないので、有効なContextはありません。

Fragment Lifecycleをご覧ください。 onAttach()onDetach()の間にはすべて、有効なContextインスタンスへの参照が含まれています。このコンテキストインスタンスは通常getActivity()

コード例を経由して取得されます。

private Helper mHelper; 

@Override 
public void onAttach(Activity activity){ 
    super.onAttach (activity); 
    mHelper = new Helper (activity); 
} 

私は私の例でonAttach()を使用し、@LaurenceDawsonはonActivityCreated()を使用しました。違いに注意してください。 onAttach()はすでにActivityが渡されているので、私はgetActivity()を使用しませんでした。代わりに私は渡された引数を使用しました。ライフサイクルでの他のメソッドについては、getActivity()を使用する必要があります。

+0

私のコードの実装のヒントを教えていただけますか? – user2426316

+0

@ user2426316例を追加しました。私とLaurenceDawsonの両方がうまくいくはずです。 –

3

いつヘルパークラスをインスタンス化しますか?フラグメントのライフサイクルでonActivityCreated()の後にあることを確認してください。

http://developer.android.com/images/fragment_lifecycle.png

次のコードは動作するはずです:あなたはFragmentが最初にインスタンス化されるときにContextを取得しようとしている

@Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    helper = new Helper(getActivity()); 
    } 
1

getActivity()は、onAttach()が呼び出される前に呼び出されると、nullを返すことができます。

関連する問題