0
public class MainActivity extends AppCompatActivity implements 
     GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, 
     LocationListener { 

    private GoogleApiClient googleApiClient; 
    private LocationRequest locationRequest; 
    private Geocoder geocoder; 
    private List<Address> addressList; 

    private TextView showLatTV, showAddrTV; 
    private String currentLat = null, currentLng = null; 
    private Bundle bundle; 
    private String apiTemp, apiArea,apiCountry,weatherCondition,apiSunrise,apiSunset,apiHumidity ; 
    String weatherUrl = "http://api.openweathermap.org/data/2.5/weather?lat=49&lon=26&APPID=8e401c96e74d2f0c07da113eb27d51d0"; 

    private final String BASE_URL = "http://api.openweathermap.org/"; 
    private WeatherData weatherData; 
    private WeatherServiceAPI weatherServiceAPI; 

    // Main Activity OnCreate Method Starts ********* 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     showLatTV = (TextView) findViewById(R.id.showLat); 
     showAddrTV = (TextView) findViewById(R.id.showAddr); 
     geocoder = new Geocoder(this); 


     googleApiClient = new GoogleApiClient.Builder(this) 
       .addApi(LocationServices.API) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .build(); 

     //Retrofit Starts ************************************ 

     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl(BASE_URL) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 
     weatherServiceAPI = retrofit.create(WeatherServiceAPI.class); 


     currentLat=String.valueOf(23.810); currentLng= String.valueOf(90.412); 
     String dynamicUrl = BASE_URL+"data/2.5/weather?lat="+currentLat+"&lon="+currentLng+"&APPID=8e401c96e74d2f0c07da113eb27d51d0"; 

     Call<WeatherData>weatherResponse = weatherServiceAPI.getWeatherResponse(dynamicUrl); 
     weatherResponse.enqueue(new Callback<WeatherData>() { 
      @Override 
      public void onResponse(Call<WeatherData> call, Response<WeatherData> response) { 
       WeatherData weatherData=response.body(); 
       //Toast.makeText(MainActivity.this, "Got It", Toast.LENGTH_SHORT).show(); 
       apiTemp = weatherData.getMain().getTemp().toString(); 
       apiArea = weatherData.getName().toString(); 
       apiCountry = weatherData.getSys().getCountry().toString(); 
       apiSunrise = weatherData.getSys().getSunrise().toString(); 
       apiSunset = weatherData.getSys().getSunset().toString(); 
       apiHumidity = weatherData.getMain().getHumidity().toString(); 
       weatherCondition = weatherData.getWeather().get(0).getMain().toString(); 

       // areaTV.setText(city); 

       Toast.makeText(MainActivity.this, " City :"+apiTemp, Toast.LENGTH_SHORT).show(); 
      } 

      @Override 
      public void onFailure(Call<WeatherData> call, Throwable t) { 
       Toast.makeText(MainActivity.this, ""+t.getMessage(), Toast.LENGTH_SHORT).show(); 
       Log.e("weather", "onFailure: "+t.getMessage()); 

      } 
     }); 

     //Retrofit Ends ************************************ 


     bundle = new Bundle(); 

     bundle.putString("temperature",apiTemp); 
     bundle.putString("areaName",apiArea); 
     bundle.putString("country",apiCountry); 
     bundle.putString("sunrise",apiSunrise); 
     bundle.putString("sunset",apiSunset); 
     bundle.putString("humidity",apiHumidity); 
     bundle.putString("condition",weatherCondition); 

     FragmentManager fm = getSupportFragmentManager(); 
     FragmentTransaction ft = fm.beginTransaction(); 
     FragmentCurrent fragmentCurrent = new FragmentCurrent(); 
     fragmentCurrent.setArguments(bundle); 
     ft.add(R.id.fragmentContainer, fragmentCurrent); 
     ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
     ft.addToBackStack(null); 
     ft.commit(); 
    } 
    // Main Activity Oncreate Method Ends ***************** 

    //Change Fragment OnClick Method Starts **************** 
    public void changeWeather(View view) { 

     Fragment fragment = null; 
     switch (view.getId()) { 
      case R.id.fragmentCurrent: 
       fragment = new FragmentCurrent(); 
       bundle.putString("temperature",apiTemp); 
       bundle.putString("areaName",apiArea); 
       bundle.putString("country",apiCountry); 
       bundle.putString("sunrise",apiSunrise); 
       bundle.putString("sunset",apiSunset); 
       bundle.putString("humidity",apiHumidity); 
       bundle.putString("condition",weatherCondition); 
       break; 
      case R.id.fragmentForecast: 
       fragment = new FragmentForecast(); 
       // bundle.putInt("b",b); 
       break; 

     } 
     FragmentManager fm = getSupportFragmentManager(); 
     FragmentTransaction ft = fm.beginTransaction(); 
     //fragment.setArguments(bundle); 
     ft.replace(R.id.fragmentContainer, fragment); 
     ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
     ft.addToBackStack(null); 
     ft.commit(); 
    } 

    //Change Fragment OnClick Method Ends ****************** 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     googleApiClient.connect(); 
    } 

    @Override 
    protected void onPause() { 
     googleApiClient.disconnect(); 
     super.onPause(); 
    } 



    @Override 
    public void onConnected(@Nullable Bundle bundle) { 

     locationRequestUpdate(); 

    } 

    public void locationRequestUpdate(){ 
     locationRequest = locationRequest.create() 
       .setInterval(1000) 
       .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 

     if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      // TODO: Consider calling 

      return; 
     } 
     LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, locationRequest, this); 

    } 

    @Override 
    public void onConnectionSuspended(int i) { 

    } 

    @Override 
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 

    } 

    @Override 
    public void onLocationChanged(Location location) { 
     showLatTV.setText(String.valueOf(location.getLatitude())); 
     try { 
      addressList = geocoder.getFromLocation(location.getLatitude(), 
        location.getLongitude(),1); 
      String addr = addressList.get(0).getAddressLine(0); 
      String country = addressList.get(0).getCountryName(); 
      showAddrTV.setText(addr+"\n"+country); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 

} 

我Fragmet代码:改造API数据传递片段

public class FragmentCurrent extends Fragment { 
    private TextView tempTV,areaTV,countryTV,sunriseTV,sunsetTV,humidityTV,conditionTV; 


    public FragmentCurrent() { 
     // Required empty public constructor 
    } 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     String temperature = getArguments().getString("temperature"); 
     String areaName = getArguments().getString("areaName"); 
     String country = getArguments().getString("country"); 
     String sunrise = getArguments().getString("sunrise"); 
     String sunset = getArguments().getString("sunset"); 
     String humidity = getArguments().getString("humidity"); 
     String weatherCondition = getArguments().getString("condition"); 


     tempTV = (TextView) getView().findViewById(R.id.showTemperature); 
     sunriseTV = (TextView) getView().findViewById(R.id.showSunrise); 
     sunsetTV = (TextView) getView().findViewById(R.id.showSunset); 
     conditionTV = (TextView) getView().findViewById(R.id.showCondition); 

     tempTV.setText(temperature); 
     sunriseTV.setText(sunrise); 
     sunsetTV.setText(sunset); 
     conditionTV.setText(weatherCondition); 

     View view = inflater.inflate(R.layout.fragment_fragment_currrent, container, false); 
     return view; 
    } 

} 

的logcat:

04-22 00:05:46.234 2684-2684/? E/libprocessgroup: failed to make and chown /acct/uid_10071: Read-only file system 
04-22 00:05:48.331 2684-2684/com.example.forever.weather E/AndroidRuntime: FATAL EXCEPTION: main 
                      Process: com.example.forever.weather, PID: 2684 
                      java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.forever.weather/com.example.forever.weather.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference 
                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325) 
                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
                       at android.app.ActivityThread.access$800(ActivityThread.java:151) 
                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
                       at android.os.Handler.dispatchMessage(Handler.java:102) 
                       at android.os.Looper.loop(Looper.java:135) 
                       at android.app.ActivityThread.main(ActivityThread.java:5254) 
                       at java.lang.reflect.Method.invoke(Native Method) 
                       at java.lang.reflect.Method.invoke(Method.java:372) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
                      Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference 
                       at com.example.forever.weather.FragmentCurrent.onCreateView**(FragmentCurrent.java:37)** 
                       at android.support.v4.app.Fragment.performCreateView(Fragment.java:2192) 
                       at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1299) 
                       at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1528) 
                       at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1595) 
                       at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:758) 
                       at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2363) 
                       at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2149) 
                       at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2103) 
                       at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2013) 
                       at android.support.v4.app.FragmentController.execPendingActions(FragmentController.java:388) 
                       at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:607) 
                       at android.support.v7.app.AppCompatActivity.onStart(AppCompatActivity.java:178) 
                       at com.example.forever.weather.MainActivity.onStart**(MainActivity.java:161)** 
                       at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1236) 
                       at android.app.Activity.performStart(Activity.java:6006) 
                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2288) 
                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)  
                       at android.app.ActivityThread.access$800(ActivityThread.java:151)  
                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)  
                       at android.os.Handler.dispatchMessage(Handler.java:102)  
                       at android.os.Looper.loop(Looper.java:135)  
                       at android.app.ActivityThread.main(ActivityThread.java:5254)  
                       at java.lang.reflect.Method.invoke(Native Method)  
                       at java.lang.reflect.Method.invoke(Method.java:372)  
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)  
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)  

我不能够传递片段中的数据。它给NullPointerException意味着数据不会去Fragment。请有人帮助我如何在Fragment中传递Retrofit API数据,或者有人可以告诉我如何以简单的方式将改进后的数据传递给Fragment?

+0

您是否尝试过数据库或共享首选项? – Remario

+0

您是否尝试过事件总线或可观察事件 – Remario

+0

其实我不知道“事件总线或可观察事件” – user3210572

回答

0

你的问题在于你在片段中使用视图的方式,在实例化视图对象的onCreateView结束处,而不是使用getView,使用视图对象本身来查找布局中的视图

View view = inflater.inflate(R.layout.fragment_fragment_currrent, container, false); 

这种说法应该是,然后再比如做

tempTV = (TextView) view.findViewById(R.id.showTemperature); 
    sunriseTV = (TextView) view.findViewById(R.id.showSunrise); 
    sunsetTV = (TextView) view.findViewById(R.id.showSunset); 
    conditionTV = (TextView)view.findViewById(R.id.showCondition); 
+0

删除所有getView并使用视图,但请确保您放置查看顶部 – Remario

+0

最主要的原因是这个onCreateView为frament获取视图,但因为它还没有创建,所以你不能使用它。至少在此生命周期中没有方法。在此生命周期方法中可能使用onActivityCreated()在创建主机活动时,会在onCreateView()方法之后调用onActivityCreated()。 – Remario

+0

也可以同步获得结果,你可以使用execute函数而不是enqueue函数进行改造,以立即取回响应。 – Remario

1

你打电话之前getView()你曾经有一个观点得到!

试试这个

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.fragment_fragment_currrent, container, false); 

    tempTV = (TextView) view.findViewById(R.id.showTemperature); 
    // find others without using getView() 

     // then get arguments 

    // then set the view data 

    return view; 
} 

您还需要进行和内public void onResponse(添加您的片段,否则,你的数据是未分配和零(因为你的要求尚未完成)

传递
相关问题