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