2015-11-06 2 views
0

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

public class LocationQueries { 
    Activity context; 

    private static int REQUEST_CODE_RECOVER_PLAY_SERVICES = 200; 

    public LocationQueries(Activity context) { 
     this.context = context; 
    } 

    public boolean checkGooglePlayServices() { 

     int checkGooglePlayServices = GooglePlayServicesUtil 
       .isGooglePlayServicesAvailable(context); 
     if (checkGooglePlayServices != ConnectionResult.SUCCESS) { 
       /* 
       * google play services is missing or update is required 
       * return code could be 
       * SUCCESS, 
       * SERVICE_MISSING, SERVICE_VERSION_UPDATE_REQUIRED, 
       * SERVICE_DISABLED, SERVICE_INVALID. 
       */ 
      GooglePlayServicesUtil.getErrorDialog(checkGooglePlayServices, 
        context, REQUEST_CODE_RECOVER_PLAY_SERVICES).show(); 

      return false; 
     } 

     return true; 

    } 
} 

я создаю экземпляр этого класса в моем фрагменте как этот

private LocationQueries locationQueries = new LocationQueries(getActivity()); 

, но когда я пытаюсь использовать locationQueries.checkGooglePlayServices();

я Caused by: java.lang.NullPointerException: Attempt to invoke virtual method android.content.pm.PackageManager android.content.Context.getPackageManager() on a null object reference. Похоже, что LocationQueries(getActivity()) фактически не передает контекст активности. Как я могу это решить?

Edit: Все работает, если я делаю то же самое от деятельности ->LocationQueries(this);

+3

Возможно, ваш фрагмент еще не присоединился к Деятельности в зависимости от того, в какой части жизненного цикла он находится. Таким образом, он может фактически вернуть значение null. Обязательно выполняйте то, что вам нужно, между onAttach (Activity) и onDetach() –

ответ

5

кажется, что вы начинаете LocationQueries в неправильном месте. В самом деле, я полагаю, это:

private LocationQueries locationQueries = new LocationQueries(getActivity()); 

называется глобальной переменной в вашем Fragment классе.
Вместо этого вы должны держать вашу переменную как глобальный, но установить его в onCreate() или onResume() следующим образом:

private class Frag extends Fragment { 

    private LocationQueries locationQueries; 
    ... 
    @Override 
    public void onCreate(Bundle inState) { 
     locationQueries = new LocationQueries(getActivity()); 
    } 
} 
+0

Спасибо. Это решило проблему. –

3

Ваш фрагмент оказывается не привязываться к деятельности.

Я подозреваю, что вы создали экземпляр объекта LocationQueries перед вызовом onAttach (Activity activity) или после того, как onDetach() был вызван на ваш фрагмент.

В таком случае вызов getActivity() будет возвращать значение null, которое затем передается в объект LocationQueries, приводящий к NPE.

Смежные вопросы