2015-02-14 23 views
39

Witam Pracuję z Fragments, który implementuje interfejs.android.content.Context.getPackageName() 'na odwołanym obiekcie o wartości zerowej

public class SigninFragment extends Fragment implements SigninInterface 

Implementacja metody interfejsu w klasie fragmentów wygląda następująco.

@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 
    } 

} 

Ta metoda jest wywoływana po wykryciu klasy AsynchronousTask (która rozszerza AsyncTask).

Ale mam awarię. a komunikat o błędzie pokazuje

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) 

Próbowałem sobie i zbadane w Google. Ale nie dostałem żadnego rozwiązania. Czy ktoś może w tym pomóc?

+0

w której linii pojawia się błąd? –

+0

show complete logcat –

Odpowiedz

26

Znalazłem błąd, co zrobiłem. Musimy wystąpienie aktywność z metody ręczne OnAttach() Przykładowo

public MainActivity activity; 

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

następnie przekazać aktywność jako związku następująco.

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

Wydaje mi się, że to błąd Androida, ale miła praca, naprawił problem dla mnie! –

+0

Dlaczego funkcja getActivity() nie działa, a odwołanie będzie działać? – ozmank

+0

Uzyskiwanie wartości null na getActivity() jest dziwne, ale tak miło pracuję. drapałem sobie głowę tym – chip

3

Wystarczy tylko, aby to zrobić:

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

odpowiedzi na to pytanie pomogła mi znaleźć mój problem, ale moje źródło było inaczej, więc mam nadzieję, że to może rzucić światło na kogoś znalezienie tego poszukiwania stronę odpowiedzi do „przypadkowej” katastrofie kontekstu:

miałem określonego obiektu SharedPreferences i próbował oznacz ją w deklaracji klasy jest to na poziomie, tak jak poniżej:

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

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

Odwołanie this przed wywołaniem metody onCreate spowodował błąd "java.lang.NullPointerException: Próba wywołania metody wirtualnej" java.lang.String android.content.Context.getPackageName() "przy odwołaniu do obiektu zerowego".

instancji obiektu wewnątrz onCreate() rozwiązać mój problem, tak jak poniżej:

public class MyFragment extends FragmentActivity { 
    private SharedPreferences sharedPref ; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     //... 
     sharedPref = PreferenceManager.getDefaultSharedPreferences(this); 

nadzieję, że pomoże.

12

Android API poziomu 23.

Zastosowanie

getContext()

zamiast

getActivity()

getActivity() daje aktywny macierzysty obiektu Context

Tutaj można wykorzystywać

MyActivity.this

zamiast

getActivity() /() getApplicationContext

+1

Otrzymuję ten sam NPE za pomocą getContext() – Ricardo

+0

niektóre telefony pobierają NPE z MyActivity.this (jeden plus i lenovo na przykład) –

+0

@ DagnogoJean-François jak rozwiązać to dla tych telefonów? –

4

Dla mnie problemem było to, że przekazywał aktywność do konstruktora, a nie do kontekstu

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

i korzystania z tej działalności do getDefaultSharedPreferences(), więc zmieniłem na aktywność kontekst i ja wciąż wywołanie konstruktora Adapter z MainActivity.this

2

W moim przypadku wystąpił błąd wewnątrz Fragment na tej linii :

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

stało po dwukrotnym kliknięciu na element, który wywołał powyższy kod tak dwa SecondaryActivity.class działania zostały uruchomione w tym samym czasie, jeden na drugim. Zamknąłem górę aktywności SecondaryActivity.class, naciskając przycisk Wstecz, który wywołał wywołanie getActivity() w SecondaryActivity.class, które pojawiło się na pierwszym planie. Połączenie z getActivity() zwróciło null. To jakiś dziwny błąd Androida, więc zwykle nie powinno się to zdarzyć.

-2

Rozwiązujesz problem za pomocą try/catch. Ta awaria ma miejsce, gdy użytkownik zamknie aplikację przed rozpoczęciem działania.

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

Świetna odpowiedź. Tak właśnie się ze mną działo. Miałem countdowntimer, który tworzyłby intencję w metodzie "onFinish". Ale jeśli użytkownik nacisnął przycisk Wstecz, aby przejść do poprzedniej czynności, w której licznik czasu nie został utworzony, wówczas uzyskałbym odwołanie do obiektu zerowego, ponieważ funkcja getActivity() przestałaby działać. Może to być przydatne również w przypadku wątków, które nie zostały zamknięte po opuszczeniu przez użytkownika działania. Wielkie dzięki! –

0

Moja klasa nie obejmuje Activiti. Rozwiązałem ten problem w ten sposób.

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