13

フラグメントでのコンテキストの使用について質問があります。私の問題は、常に NullpointerException が発生することです。これが私がすることです:

SherlockFragment を拡張するクラスを作成します。そのクラスには、別のヘルパー クラスのインスタンスがあります。

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

    // More code ...
}

他の Helper クラスの抜粋を次に示します。

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

context.someMethod(たとえば context.getResources() )を呼び出すたびに、NullPointerException が発生します。何故ですか?

4

4 に答える 4

28

が最初にインスタンス化されたContextときにを取得しようとしています。Fragmentその時点では、 に関連付けられていActivityないため、有効な はありませんContext

Fragment Lifecycleを見てください。onAttach()有効な Context インスタンスへの参照をonDetach()含むすべてのもの。この Context インスタンスは通常、次の方法で取得されますgetActivity()

コード例:

private Helper mHelper;

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

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

于 2013-08-09T20:17:43.750 に答える
1

getActivity()null呼び出される前に呼び出された場合は戻ることができonAttach()ます。次のようなものをお勧めします。

public class Fragment extends SherlockFragment { 

    private Helper helper;

    // Other code

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        helper = new Helper(activity);
    }
} 
于 2013-08-09T21:09:14.347 に答える
0

こんにちは、質問に答えましたが、通常、フラグメントまたはダイアログフラグメントでコンテキストを取得する場合は、これを使用します

protected lateinit var baseActivity: BaseActivity
protected lateinit var contextFragment: Context

override fun onAttach(context: Context) {
    super.onAttach(context)
    if (context is BaseActivity) {
        this.baseActivity = context
    }
    this.contextFragment = context
}

そしてJavaで

 protected BaseActivity baseActivity;
 protected Context context;

 @Override
 public void onAttach(@NonNull Context context) {
    super.onAttach(context);
    this.context = context;
    if (context instanceof BaseActivity) {
        this.baseActivity = (BaseActivity) context;
    }
}
于 2020-03-30T13:42:06.320 に答える