2015-11-16 2 views
1

Создается экземпляр ShowActivities, когда я нажимаю кнопку. В первый раз, когда я нажимаю, все работает нормально. Это то, что я получаю в logCat:getActivity() возвращает null - второй раз, когда я открываю фрагмент

11-16 23:41:12.560 25874-25874/name.company.newapp E/onCreate: getActivity() == null: false 
11-16 23:41:12.560 25874-25874/name.company.newapp E/onCreate: Hash: 1036405628 
11-16 23:41:12.570 25874-25874/name.company.newapp E/onCreateView: getActivity() == null: false 
11-16 23:41:12.570 25874-25874/name.company.newapp E/onCreateView: Hash: 1036405628 
11-16 23:41:12.630 25874-25874/name.company.newapp E/onConnected: getActivity() == null: false 
11-16 23:41:12.630 25874-25874/name.company.newapp E/onConnected: Hash: 1036405628 

Все работает нормально. Я нажимаю кнопку назад и возвращаюсь к предыдущему фрагменту. И теперь я снова нажмите кнопку, чтобы открыть ShowActivities фрагмент и что теперь LogCat возвратов:

11-16 23:41:13.890 25874-25874/name.company.newapp E/onCreate: getActivity() == null: false 
11-16 23:41:13.890 25874-25874/name.company.newapp E/onCreate: Hash: 252302789 
11-16 23:41:13.890 25874-25874/name.company.newapp E/onCreateView: getActivity() == null: false 
11-16 23:41:13.890 25874-25874/name.company.newapp E/onCreateView: Hash: 252302789 
11-16 23:41:13.900 25874-25874/name.company.newapp E/onConnected: getActivity() == null: true 
11-16 23:41:13.900 25874-25874/name.company.newapp E/onConnected: Hash: 1036405628 

onConnected называется на одном фрагменте, хотя OnCreate создает другой.

ShowActivities фрагмент

public class ShowActivities extends Fragment implements 
      GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener { 


     public ShowActivities() { 
     } 

     private static GoogleApiClient googleClient; 
     private Location mLastLocation; 
     private PendingResult<LocationSettingsResult> result; 
     private LocationRequest locationRequest; 



     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
     Log.e("onCreate"," "+(getActivity() == null)); 
      if (googleClient==null) { 
       googleClient = new GoogleApiClient.Builder(getActivity()) 
         .addApi(LocationServices.API) 
         .addConnectionCallbacks(this) 
         .addOnConnectionFailedListener(this) 
         .build(); 
      } 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
           Bundle savedInstanceState) { 
super.onCreateView(inflater, container, savedInstanceState); 
Log.e("onCreateView"," "+(getActivity() == null)); 
      // Defines the xml file for the fragment 
      View view = inflater.inflate(R.layout.upload_activity_fragment, container, false); 
      return view; 
     } 


     @Override 
     public void onViewCreated(View view, Bundle savedInstanceState) { 

     } 


     @Override 
     public void onConnected(Bundle bundle) { 
      Log.e("onConnected"," "+(getActivity() == null)); 
      locationRequest = LocationRequest.create(); 
      locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 

      LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder() 
        .addLocationRequest(locationRequest); 

      builder.setAlwaysShow(true); 
      result = LocationServices.SettingsApi.checkLocationSettings(googleClient, builder.build()); 

      if (result != null) { 
       result.setResultCallback(new ResultCallback<LocationSettingsResult>() { 
        @Override 
        public void onResult(LocationSettingsResult locationSettingsResult) { 
         final Status status = locationSettingsResult.getStatus(); 
         switch (status.getStatusCode()) { 
          case LocationSettingsStatusCodes.SUCCESS: 
           // All location settings are satisfied. The client can initialize location 
           // requests here. 

           break; 
          case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: 
           // Location settings are not satisfied. But could be fixed by showing the user 
           // a optionsDialog. 
           try { 
            // Show the optionsDialog by calling startResolutionForResult(), 
            // and check the result in onActivityResult(). 
            if (status.hasResolution()) { 
             status.startResolutionForResult(getActivity(), 1000); 
             Log.e("location", "Resolution"); 
            } 
           } catch (IntentSender.SendIntentException e) { 
            // Ignore the error. 
            Log.e("location", "Resolution2"); 
           } 
           break; 
          case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: 
           // Location settings are not satisfied. However, we have no way to fix the 
           // settings so we won't show the optionsDialog. 
           break; 
         } 
        } 
       }); 
      } 
     } 

     @Override 
     public void onActivityResult(int requestCode, int resultCode, Intent data) { 
      super.onActivityResult(requestCode, resultCode, data); 
      if ((resultCode == Activity.RESULT_OK) && (requestCode == 1000)) { 
       mLastLocation = LocationServices.FusedLocationApi.getLastLocation(googleClient); 
      } 
     } 

     @Override 
     public void onConnectionSuspended(int i) { 

     } 

     @Override 
     public void onConnectionFailed(ConnectionResult connectionResult) { 

     } 

     @Override 
     public void onLocationChanged(Location location) { 
      Log.e("location", "finally"); 
     } 

     @Override 
     public void onResume() { 
      super.onResume(); 

     } 

     @Override 
     public void onPause() { 
      super.onPause(); 
      if (googleClient!=null) { 
       googleClient = null; 
      } 
     } 

    } 

Эта задача была решена. Я изменил onPause, чтобы сделать googleClient null после выхода из фрагмента.

+0

Почему вы не инициализируете фрагмент перед выполнением транзакции? – Coeus

+0

Я не думаю, что в этом проблема –

+0

- это 'FragmentActivities'' Fragment' или 'Activity'? – petey

ответ

0

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

Fragment ShowActivities = getFragmentManager().getFragmentByTag(YOUR_TAG); 
    if (showActivities == null) { 
     showActivities = new ShowActivities(); 
     getFragmentManager().beginTransaction() 
       .replace(R.id.your_placeholder, showActivities, YOUR_TAG) 
       .addToBackStack(null) 
       .commit(); 
    } 
+0

всегда есть что-то в заполнителе. Я использую один и тот же заполнитель для всех фрагментов. –

+0

Тогда вы можете использовать тег в методе replace для идентификации этого экземпляра. –

+0

Хорошо, я попытаюсь изменить его сейчас, но как это решит проблему? –

0

Прежде всего, измените вызов метода super в onCreateView, чтобы вызвать super.onCreateView (...), пожалуйста.

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    // Defines the xml file for the fragment 
    View view = inflater.inflate(R.layout.upload_activity_fragment, container, false); 
    return view; 
} 

Затем переместите этот кусок к onActivityCreated (...)

client = new NightAssetRestClient(getActivity()); 
    locationQueries = new LocationQueries(getActivity()); 
    if (googleClient==null) { 
     googleClient = new GoogleApiClient.Builder(getActivity()) 
       .addApi(LocationServices.API) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .build(); 
    } 

Тем не менее, вам необходимо проверить нуль в OnConnect (...) в любом случае, потому что процесс Асинхронный может содержать ссылку на эту Фрагмент, даже если основная операция уничтожена.

Добавление строки setRetainInstance(boolean) в метод onCreate может помочь.

+0

Измените его. Сожалею. Обычно у меня ничего нет в других фрагментах. Я добавил его, потому что думал, что это может решить проблему. Я изменил его теперь на 'super.onCreateView (надувной элемент, контейнер, savedInstanceState); ' –

+0

Проблема не была в любом случае. Я понятия не имею, как это происходит. –

+0

getActivity (..) не гарантирует возврата значения в любом случае. Мой отредактированный ответ может помочь устранить проблему. –

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