-5

I want to show the position of latitude and longitude on the TextView when I access page with fragment.

Here is my code:

import android.app.Activity;
import android.location.Location;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;

import info.androidhive.materialdesign.R;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacks;
import com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;


public class GpsFragment extends Fragment implements ConnectionCallbacks,
        OnConnectionFailedListener {

    private static String TAG = MainActivity.class.getSimpleName();

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

    private final static int PLAY_SERVICES_RESOLUTION_REQUEST = 1000;
    private Location mLastLocation;

    // Google client to interact with Google API
    private GoogleApiClient mGoogleApiClient;

    // boolean flag to toggle periodic location updates
    private boolean mRequestingLocationUpdates = false;

    private LocationRequest mLocationRequest;

    public TextView lblLocation;

    // Location updates intervals in sec
    private static int UPDATE_INTERVAL = 10000; // 10 sec
    private static int FATEST_INTERVAL = 5000; // 5 sec
    private static int DISPLACEMENT = 10; // 10 meters

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_gps, container, false);

        lblLocation = (TextView)rootView.findViewById(R.id.lblLocation);

        // First we need to check availability of play services
        if (checkPlayServices()) {
            buildGoogleApiClient();
        }

        return rootView;
    }

    private void displayLocation() {

        mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);

        if (mLastLocation != null) {
            double latitude = mLastLocation.getLatitude();
            double longitude = mLastLocation.getLongitude();
            lblLocation.setText(latitude + ", " + longitude);
        } else {
            //lblLocation.setText("(Couldn't get the location. Make sure location is enabled on the device)");
        }
    }

    protected synchronized void buildGoogleApiClient() {
        mGoogleApiClient = new GoogleApiClient.Builder(getActivity())
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API).build();
    }

    private boolean checkPlayServices() {
        int resultCode = GooglePlayServicesUtil
                .isGooglePlayServicesAvailable(getActivity());
        if (resultCode != ConnectionResult.SUCCESS) {
            if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) {
                GooglePlayServicesUtil.getErrorDialog(resultCode, getActivity(),
                        PLAY_SERVICES_RESOLUTION_REQUEST).show();
            } else {
                Toast.makeText(getActivity().getApplicationContext(),
                        "This device is not supported.", Toast.LENGTH_LONG)
                        .show();
                getActivity().finish();
            }
            return false;
        }
        return true;
    }



    @Override
    public void onStart() {
        super.onStart();
        if (mGoogleApiClient != null) {
            mGoogleApiClient.connect();
        }
    }

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

    @Override
    public void onConnectionFailed(ConnectionResult result) {
        Log.i(TAG, "Connection failed: ConnectionResult.getErrorCode() = "
                + result.getErrorCode());
    }

    @Override
    public void onConnected(Bundle arg0) {
        displayLocation();
    }

    @Override
    public void onConnectionSuspended(int arg0) {
        mGoogleApiClient.connect();
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
    }

    @Override
    public void onDetach() {
        super.onDetach();
    }
}

logcat error:

Process: info.androidhive.materialdesign, PID: 2015
    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
            at info.androidhive.materialdesign.activity.GpsFragment.displayLocation(GpsFragment.java:81)
            at info.androidhive.materialdesign.activity.GpsFragment.onConnected(GpsFragment.java:135)
            at com.google.android.gms.common.internal.zzk.zzh(Unknown Source)
            at com.google.android.gms.common.api.zzg.zznt(Unknown Source)
            at com.google.android.gms.common.api.zzg.onConnected(Unknown Source)
            at com.google.android.gms.common.api.zzi$2.onConnected(Unknown Source)
            at com.google.android.gms.common.internal.zzj$zzg.zzoD(Unknown Source)
            at com.google.android.gms.common.internal.zzj$zza.zzc(Unknown Source)
            at com.google.android.gms.common.internal.zzj$zza.zzs(Unknown Source)
            at com.google.android.gms.common.internal.zzj$zzc.zzoF(Unknown Source)
            at com.google.android.gms.common.internal.zzj$zzb.handleMessage(Unknown Source)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:148)
            at android.app.ActivityThread.main(ActivityThread.java:5417)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Bertho Joris
  • 1,483
  • 5
  • 27
  • 60

1 Answers1

1

You use setText in displayLocation(), which is called in onConnected(), which is called in onStart(). It means that onCreateView() has been called already, so your view should be created.

The only possibility is that you don't have TextView with id lblLocation in fragment_gps.xml layout.

Damian Kozlak
  • 7,065
  • 10
  • 45
  • 51
  • Apparently after I move the position ID from bottom to top position, this error eventually disappear. Does it matter? Position naming ID in XML? – Bertho Joris Sep 14 '15 at 09:04
  • It doesn't matter. If possible, add your `fragment_gps.xml`, because maybe you did something else wrong, which caused error. – Damian Kozlak Sep 14 '15 at 09:05