web-dev-qa-db-ja.com

nullオブジェクト参照のandroid.content.Context.getPackageName() '

こんにちは、私はインターフェイスを実装するフラグメントで作業しています。

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で調べました。しかし、解決策は得られませんでした。誰でもこれを助けることができますか?

61
Karthikeyan Ve

私は自分がしたことの間違いを見つけました。オーバーライドメソッドOnAttach()からアクティビティインスタンスを取得する必要があります。たとえば、

public MainActivity activity;

@Override
public void onAttach(Activity activity){
    this.activity = activity;
}

次に、アクティビティを次のようにコンテキストとして渡します。

Intent mIntent = new Intent(activity, MusicHome.class);
34
Karthikeyan Ve

この質問に対する答えは私の問題を見つけるのに役立ちましたが、私のソースは異なっていたので、このページが「ランダムな」コンテキストクラッシュの答えを探している人を見つけることができれば幸いです:

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);

お役に立てば幸いです。

23
mix3d

Android APIレベル23。

つかいます

getContext()

の代わりに

getActivity()

getActivity()は、親Activity、Contextオブジェクトを提供します

ここで使用できます

MyActivity.this

の代わりに

getActivity()/ getApplicationContext()

19
sivaBE35

私にとっての問題は、ContextではなくActivityをコンストラクタに渡すことでした

public Adapter(Activity activity, List<MediaItem> items, boolean can) {
    mItems = items;
    canEdit = can;
    mActivity = activity;
}

このアクティビティをgetDefaultSharedPreferences()に使用するため、ActivityをContextに変更し、MainActivity.thisでアダプタコンストラクタを呼び出していました。

4
SpyZip

あなただけがこれをする必要があります:

Intent myIntent = new Intent(MainActivity.this, nextActivity.class);

私の場合、この行のFragment内でエラーが発生しました。

Intent intent = new Intent(getActivity(), SecondaryActivity.class);

上記のコードをトリガーしたアイテムをダブルクリックすると、2つのSecondaryActivity.classアクティビティが同時に起動され、一方が他方の上に表示されたときに発生しました。フォアグラウンドになったSecondaryActivity.classgetActivity()の呼び出しをトリガーする戻るボタンを押して、トップのSecondaryActivity.classアクティビティを閉じました。 getActivity()の呼び出しはnullを返しました。何らかの奇妙なAndroidバグなので、通常は発生しません。

3
vovahost

私のクラスはActivitiに拡張されていません。この方法で問題を解決しました。

class MyOnBindViewHolder : LogicViewAdapterModel.LogicAdapter {
          ...
 holder.title.setOnClickListener({v->
                v.context.startActivity(Intent(context,  HomeActivity::class.Java))
            })
          ...
    }
1
Segrei Ulanov

Try/catchで問題を解決します。このクラッシュは、ユーザーが開始インテントの前にアプリを閉じると発生します。

try
{
    Intent mIntent = new Intent(getActivity(),MusicHome.class);
    mIntent.putExtra("SigninFragment.user_details", bundle);
    startActivity(mIntent);
}
catch (Exception e) {
    e.printStackTrace();
}
0
user2912087