こんにちは、私はインターフェイスを実装するフラグメントで作業しています。
public class SigninFragment extends Fragment implements SigninInterface
フラグメントクラスでのインターフェイスのメソッド実装は次のとおりです。
@Override
public void afterSubmitClicked(String userId, Bundle bundle) {
Log.d(TAG,"Calling time afterSubmitClicked called"+bundle);
if(!userId.equals("-1")){
//Logged in successfully
//Move to MusicHome
Intent mIntent = new Intent(getActivity(),MusicHome.class);
mIntent.putExtra("SigninFragment.user_details", bundle);
startActivity(mIntent);
}else{
//Logging in failed
//show error dialog
}
}
このメソッドは、AsynchronousTask(AsyncTaskを拡張する)クラスを実行した後に呼び出されます。
しかし、私はクラッシュしています。そして、エラーメッセージが表示されます
Java.lang.NullPointerException: Attempt to invoke virtual method 'Java.lang.String Android.content.Context.getPackageName()' on a null object reference
Logcat
02-14 16:37:04.648: E/AndroidRuntime(28177): Process: com.raaga.Android, PID: 28177
02-14 16:37:04.648: E/AndroidRuntime(28177): Java.lang.NullPointerException: Attempt to invoke virtual method 'Java.lang.String Android.content.Context.getPackageName()' on a null object reference
02-14 16:37:04.648: E/AndroidRuntime(28177): at Android.content.ComponentName.<init>(ComponentName.Java:77)
02-14 16:37:04.648: E/AndroidRuntime(28177): at Android.content.Intent.<init>(Intent.Java:3996)
02-14 16:37:04.648: E/AndroidRuntime(28177): at com.raaga.fragments.SigninFragment.afterSubmitClicked(SigninFragment.Java:152)
02-14 16:37:04.648: E/AndroidRuntime(28177): at com.raaga.asynctask.SignInAsyncTask.onPostExecute(SignInAsyncTask.Java:92)
02-14 16:37:04.648: E/AndroidRuntime(28177): at com.raaga.asynctask.SignInAsyncTask.onPostExecute(SignInAsyncTask.Java:1)
02-14 16:37:04.648: E/AndroidRuntime(28177): at Android.os.AsyncTask.finish(AsyncTask.Java:632)
02-14 16:37:04.648: E/AndroidRuntime(28177): at Android.os.AsyncTask.access$600(AsyncTask.Java:177)
02-14 16:37:04.648: E/AndroidRuntime(28177): at Android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.Java:645)
02-14 16:37:04.648: E/AndroidRuntime(28177): at Android.os.Handler.dispatchMessage(Handler.Java:102)
02-14 16:37:04.648: E/AndroidRuntime(28177): at Android.os.Looper.loop(Looper.Java:135)
02-14 16:37:04.648: E/AndroidRuntime(28177): at Android.app.ActivityThread.main(ActivityThread.Java:5221)
02-14 16:37:04.648: E/AndroidRuntime(28177): at Java.lang.reflect.Method.invoke(Native Method)
02-14 16:37:04.648: E/AndroidRuntime(28177): at Java.lang.reflect.Method.invoke(Method.Java:372)
02-14 16:37:04.648: E/AndroidRuntime(28177): at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:899)
02-14 16:37:04.648: E/AndroidRuntime(28177): at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:694)
自分で試してみて、Googleで調べました。しかし、解決策は得られませんでした。誰でもこれを助けることができますか?
私は自分がしたことの間違いを見つけました。オーバーライドメソッドOnAttach()からアクティビティインスタンスを取得する必要があります。たとえば、
public MainActivity activity;
@Override
public void onAttach(Activity activity){
this.activity = activity;
}
次に、アクティビティを次のようにコンテキストとして渡します。
Intent mIntent = new Intent(activity, MusicHome.class);
この質問に対する答えは私の問題を見つけるのに役立ちましたが、私のソースは異なっていたので、このページが「ランダムな」コンテキストクラッシュの答えを探している人を見つけることができれば幸いです:
SharedPreferencesオブジェクトを指定し、次のようにクラスレベルの宣言でインスタンス化しようとしました。
public class MyFragment extends FragmentActivity {
private SharedPreferences sharedPref =
PreferenceManager.getDefaultSharedPreferences(this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//...
OnCreateの前にthis
を参照すると、「Java.lang.NullPointerException:nullオブジェクト参照で仮想メソッド 'Java.lang.String Android.content.Context.getPackageName()'を呼び出そうとする」エラーが発生しました。
OnCreate()内でオブジェクトをインスタンス化すると、次のように問題が解決しました。
public class MyFragment extends FragmentActivity {
private SharedPreferences sharedPref ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//...
sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
お役に立てば幸いです。
Android APIレベル23。
つかいます
getContext()
の代わりに
getActivity()
getActivity()は、親Activity、Contextオブジェクトを提供します
ここで使用できます
MyActivity.this
の代わりに
getActivity()/ getApplicationContext()
私にとっての問題は、ContextではなくActivityをコンストラクタに渡すことでした
public Adapter(Activity activity, List<MediaItem> items, boolean can) {
mItems = items;
canEdit = can;
mActivity = activity;
}
このアクティビティをgetDefaultSharedPreferences()に使用するため、ActivityをContextに変更し、MainActivity.thisでアダプタコンストラクタを呼び出していました。
あなただけがこれをする必要があります:
Intent myIntent = new Intent(MainActivity.this, nextActivity.class);
私の場合、この行のFragment
内でエラーが発生しました。
Intent intent = new Intent(getActivity(), SecondaryActivity.class);
上記のコードをトリガーしたアイテムをダブルクリックすると、2つのSecondaryActivity.class
アクティビティが同時に起動され、一方が他方の上に表示されたときに発生しました。フォアグラウンドになったSecondaryActivity.class
でgetActivity()
の呼び出しをトリガーする戻るボタンを押して、トップのSecondaryActivity.class
アクティビティを閉じました。 getActivity()
の呼び出しはnull
を返しました。何らかの奇妙なAndroidバグなので、通常は発生しません。
私のクラスはActivitiに拡張されていません。この方法で問題を解決しました。
class MyOnBindViewHolder : LogicViewAdapterModel.LogicAdapter {
...
holder.title.setOnClickListener({v->
v.context.startActivity(Intent(context, HomeActivity::class.Java))
})
...
}
Try/catchで問題を解決します。このクラッシュは、ユーザーが開始インテントの前にアプリを閉じると発生します。
try
{
Intent mIntent = new Intent(getActivity(),MusicHome.class);
mIntent.putExtra("SigninFragment.user_details", bundle);
startActivity(mIntent);
}
catch (Exception e) {
e.printStackTrace();
}