Подтвердить что ты не робот

Android.content.Context.getPackageName() 'для ссылки на нулевой объект

Привет, я работаю с Fragments, который реализует интерфейс.

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. Но я не получил никакого решения. Может ли кто-нибудь помочь в этом?

4b9b3361

Ответ 1

Я нашел ошибку, что сделал. Нам нужно получить экземпляр действия из метода переопределения OnAttach() Например,

public MainActivity activity;

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

Затем передайте действие как контекст следующим образом.

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

Ответ 2

Ответы на этот вопрос помогли мне найти мою проблему, но мой источник был другим, поэтому, надеюсь, это поможет пролить свет на кого-то, кто найдет эту страницу в поисках ответов на случайный сбой контекста:

Я указал объект SharedPreferences и попытался создать его экземпляр в объявлении уровня класса, например, так:

public class MyFragment extends FragmentActivity {
    private SharedPreferences sharedPref =
        PreferenceManager.getDefaultSharedPreferences(this);

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //...

Ссылка this до того, как onCreate вызвала ошибку "java.lang.NullPointerException: попытка вызвать виртуальный метод 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);

Надеюсь, это поможет.

Ответ 3

уровень API Android 23.

Используйте

getContext()

вместо

getActivity()

getActivity() предоставляет родительскую активность, объект контекста

Здесь вы можете использовать

MyActivity.this

вместо

getActivity()/getApplicationContext()

Ответ 4

Вам нужно только сделать это:

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

Ответ 5

Для меня проблема заключалась в том, что я передавал Activity конструктору, а не Context

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

и используя эту активность для getDefaultSharedPreferences(), поэтому я изменил Activity на Context, и я все еще вызывал конструктор Adapter с MainActivity.this

Ответ 6

В моем случае ошибка произошла внутри Fragment в этой строке:

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

Это произошло, когда я дважды щелкнул по элементу, который вызвал приведенный выше код, поэтому одновременно были запущены два действия SecondaryActivity.class, одно поверх другого. Я закрыл верхнюю активность SecondaryActivity.class, нажав кнопку "назад", которая вызвала вызов getActivity() в SecondaryActivity.class, который вышел на передний план. Вызов getActivity() возвратил null. Это какая-то странная ошибка Android, поэтому обычно этого не должно быть. Вы можете заблокировать щелчки после того, как пользователь нажал один раз.

Ответ 7

У меня была такая же проблема при попытке показать тост в фрагменте.

После некоторой отладки я обнаружил, что удаляю фрагмент перед вызовом:

Toast.makeText(getContext(), "text", Toast.LENGTH_SHORT).show();

Поскольку фрагмент был удален, контекст стал нулевым, вызывая исключение.

Простое решение: вызовите getContext() перед удалением фрагмента.

Ответ 8

Мой класс не распространяется на Activiti. Я решил проблему таким образом.

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

Ответ 9

Вы решаете проблему с помощью try/catch. Этот сбой происходит, когда пользователь закрывает приложение до намерения начать.

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