Fragment中的Retrofit API数据传递

时间:2017-04-21 16:59:21

标签: java android android-fragments nullpointerexception retrofit2

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();
        }

    }

}

My Fragmet Code:

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) 

我无法在Fragment中传递数据。它给出了NullPointerException,这意味着数据不会进入Fragment。请有人帮助我如何在Fragment中传递Retrofit API数据,或者有人能告诉我如何以简单的方式传递Fragment中的改造数据?

2 个答案:

答案 0 :(得分: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(内制作和添加片段,否则,您的数据将作为未分配和null传递(因为您的请求尚未完成)

答案 1 :(得分: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);