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

    }

}

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) 

I am not being able to pass the data in Fragment. It giving NullPointerException that means data not going to Fragment. Please, someone, help me how can I pass the Retrofit API data in Fragment or can someone show me how i can pass retrofit data in Fragment in a easy Way ?

Phantômaxx
  • 37,901
  • 21
  • 84
  • 115
user3210572
  • 11
  • 1
  • 6

2 Answers2

2

You're calling getView() before you ever have a view to get!

Try this instead

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

You'll also want to make and add your Fragment within public void onResponse(, otherwise, your data is passed as unassigned and null (because your request hasn't completed yet)

OneCricketeer
  • 179,855
  • 19
  • 132
  • 245
1

Your problem lies in the way you are using the view in the fragment,at the end of the onCreateView you are instantiating a view object, instead of using getView , use the view object itself to find the views in the layout

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

that statement should be first, then for example do

    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);
Remario
  • 3,813
  • 2
  • 18
  • 25
  • remove all getView and use view, but make sure , you place the view at the top – Remario Apr 23 '17 at 13:53
  • the main reason is this onCreateView creates the view for the frament to get, but becuase it is not created yet, you cannot use it. at least no in this life cycle method.use it possibly in this life cycle method, onActivityCreated()The onActivityCreated() is called after the onCreateView() method when the host activity is created. – Remario Apr 23 '17 at 13:57
  • also to get the results synchronously you can the execute function instead of the enqueue function for retrofit to immediately get back a response. – Remario Apr 23 '17 at 14:14