Java – Access methods from Fragment in Button Click in MainActivity

Access methods from Fragment in Button Click in MainActivity… here is a solution to the problem.

Access methods from Fragment in Button Click in MainActivity

Everyone,

I’m trying to send the user’s current latitude and longitude to MapFragment(Fragment) by clicking a button in MainActivity. I use the interface of the fragment implemented in MainActivity, but when I try to access the method from the fragment onButtonClick, I get a

at android.app.ActivityThread.main(ActivityThread.java:5221)
            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:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method ‘void com.xtechkid.blah.threadingapplication.MapDemoActivity.setupCurrlocation( com.google.android.gms.maps.model.LatLng)’ on a null object reference
at com.xtechkid.sudheej.threadingapplication.MainActivity.findLocation(MainActivity.java:67)

My code is below

This is the map fragment

public class MapDemoActivity extends Fragment {
final LatLng MU = new LatLng(40.8874245, 67.0200729);
private GoogleMap mMap;  Might be null if Google Play services APK is not available.
CommInter mCallback;
public interface CommInter {
    public void communicatesWithActivity(double lati,double longi);
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);

Activity a;

 if (context instanceof Activity){
        a=(Activity) context;
    //}

try{
        mCallback = (CommInter) a;
    }catch (ClassCastException e){
        throw new ClassCastException(a.toString());
    }
}
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.activity_main, container, false);

setUpMapIfNeeded();

if (mMap != null) {
        mMap.setMyLocationEnabled(true);
    }

return view;
}
This method when called from Main is throwing Exception
public void setupCurrlocation(LatLng MUSEUM) {
    makeText(getContext(), "I am inside the function ", Toast.LENGTH_LONG).show();
    System.out.println("I am inside the function");
    /*CameraPosition cameraPosition = new CameraPosition.Builder()
            .target(MUSEUM)
            .zoom(10)
            .bearing(70)
            .tilt(25)
            .build();
mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
*/
    }

}

The code for the main activity

import android.app.FragmentManager;
import android.support.v7.app.AppCompatActivity;
import android.content.Intent;
import android.location.LocationManager;
import android.os.Bundle;
import android.provider.Settings;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.maps.model.LatLng;

public class MainActivity extends AppCompatActivity implements       MapDemoActivity.CommInter  {

private TextView txtLocation;
private String provider;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

@Override
public void communicatesWithActivity(double lati, double longi) {
    MapDemoActivity mapFrag = (MapDemoActivity)getSupportFragmentManager().findFragmentById(R.id.map);
    final LatLng MUSEU = new LatLng(38.8874245, 77.0200729);
    final LatLng MUSEU = new LatLng(lati, longi);
    mapFrag.setupCurrlocation(MUSEU);
}

public void findLocation(View v) {
    final LatLng setLoc =  new LatLng(38.8874245, -77.0200729);
    MapDemoActivity fragment;
    Fragment t = (Fragment)getSupportFragmentManager()findViewById(R.id.map);
    fragment.setupCurrlocation(v,setLoc);
    txtLocation = (TextView) findViewById(R.id.textViewLocation);
    LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE);
    boolean isLocEnabled = service.isProviderEnabled(LocationManager.GPS_PROVIDER);
    if (!isLocEnabled) {
        Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
        startActivity(intent);
    }

GPSTracker gps = new GPSTracker(MainActivity.this);

 check if GPS enabled
    if(gps.canGetLocation()){

double latitude = gps.getLatitude();
        double longitude = gps.getLongitude();

 \n is for new line

Toast.makeText(getApplicationContext(), "Your Location is - \nLat: " + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show();
        txtLocation.setText("Lat: " + latitude + "Long: " + longitude);

System.out.println(MUS);
        The PROBLEM IS HERE I DONT KNOW THE FIX 
        communicatesWithActivity(latitude,long);

}else{
         can't get location
         GPS or Network is not enabled
         Ask user to enable GPS/network in settings
        gps.showSettingsAlert();
    }

}

}

Solution

You are not using Google Maps. You need to do all these imports where setupcurrlocation is called.

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
 et al...

public void setupCurrlocation(LatLng MUSEUM) {
    GoogleMap googleMap = ((MapFragment) fragmentManager.
                    findFragmentById(R.id.map)).getMap();
    googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
    Marker marker = googleMap.addMarker(new MarkerOptions().position(latLng).title(null));
    CameraPosition cameraPosition = new CameraPosition.Builder().target(MUSEUM).zoom(10).bearing(70).tilt(25)
                            .build();
    googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));

}

Basically, I’ll use this method in the activity attached to the fragment. Then you need to manage the visibility of Google Maps. Because it will remain on top of other fragments.
By controlling the visibility of a frame layout, you can control the visibility of a map within its frame layout.

Example:

// your activity layout here:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    TO DO/>

<RelativeLayout
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:id="@+id/myrellayout">

 ALL THE THINGS IN YOUR ACTIVTY

</RelativeLayout>

 THE FRAMELAYOUTS MANAGE YOUR MAP FRAGMENT AND OTHER FRAGMENTS VISIBILITY

<FrameLayout
        android:id="@+id/firstfrag"
        android:layout_below="@+id/myrellayout"
        android:layout_height="fill_parent"
        android:layout_width="match_parent"
        android:visibility="gone"/>

<FrameLayout
        android:id="@+id/secondfrag"
        android:layout_below="@+id/myrellayout"
        android:layout_height="fill_parent"
        android:layout_width="match_parent"
        android:visibility="gone"/>

<fragment
            android:id="@+id/map"
            android:layout_height="match_parent"
            android:layout_width="match_parent"
            android:name="com.google.android.gms.maps.MapFragment"/>
    </FrameLayout>
</RelativeLayout>

https://developers.google.com/maps/documentation/android-api/
https://developers.google.com/maps/documentation/javascript/examples/

Related Problems and Solutions