Привет я работаю с Фрагментами, который реализует интерфейс.
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
}
}
Этот метод называют после exectuting 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. Но я не получил решения. Кто-либо мог помочь на этом?
В моем случае ошибка произошла в Fragment
на этой строке:
Intent intent = new Intent(getActivity(), SecondaryActivity.class);
Это произошло, когда я дважды щелкнул по объекту, который инициировал код выше так два SecondaryActivity.class
, операции были запущены одновременно, один сверху другого. Я закрыл вершину SecondaryActivity.class
действие путем нажатия кнопки "Назад", которая инициировала вызов к getActivity()
в SecondaryActivity.class
, который прибыл в передний план. Вызов к getActivity()
возвратился null
. Это - некоторая странная ошибка Android, таким образом, этого обычно не должно происходить. Можно заблокировать щелчки после того, как пользователь нажал однажды.
У меня была та же проблема при попытке показать Тост во фрагменте.
После некоторой отладки я узнал, что удалял фрагмент перед вызовом:
Toast.makeText(getContext(), "text", Toast.LENGTH_SHORT).show();
, поскольку фрагмент был удален , контекст стал пустым, вызвав исключение.
Простое решение: звоните getContext()
прежде, чем удалить фрагмент.
Мой класс не, расширяется на Activiti. Я решил проблему этот путь.
class MyOnBindViewHolder : LogicViewAdapterModel.LogicAdapter {
...
holder.title.setOnClickListener({v->
v.context.startActivity(Intent(context, HomeActivity::class.java))
})
...
}
Вы решаете проблему с попыткой / выгода. Этот катастрофический отказ происходит, когда пользователь закрывает приложение перед намерением запуска.
try
{
Intent mIntent = new Intent(getActivity(),MusicHome.class);
mIntent.putExtra("SigninFragment.user_details", bundle);
startActivity(mIntent);
}
catch (Exception e) {
e.printStackTrace();
}
Для меня проблема состояла в том, что я передавал Действие конструктору, не Контекст
public Adapter(Activity activity, List<MediaItem> items, boolean can) {
mItems = items;
canEdit = can;
mActivity = activity;
}
и использовал это действие для getDefaultSharedPreferences (), таким образом, я изменил Действие на Контекст, и я все еще вызывал конструктора Adapter с MainActivity.this
Ответы на этот вопрос помогли мне найти свою проблему, но мой источник отличался, таким образом, надо надеяться, это может пролить свет на кого-то находящего эту страницу, ищущую ответы на 'случайный' катастрофический отказ контекста:
я указал объект 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. Строка 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);
Hope, которая помогает.
уровень API 23.
андроида Использует
getContext ()
вместо
getActivity ()
, getActivity () дает родительское Действие, Объект контекста
Здесь, можно использовать
MyActivity.this
вместо [1 112]
getActivity () / getApplicationContext ()
Только необходимо сделать это:
Intent myIntent = new Intent(MainActivity.this, nextActivity.class);