Folks,
I am trying to send users current latitude and longitude from a button click in MainActivity to MapFragment(Fragment). I use interface from fragment implemented inMainActivity but when i try to acess 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
Here 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));
*/
}
}
Code from 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();
}
}
}
You are not using google maps. You need to have all these imports where you are calling setupcurrlocation.
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 would have this method within the activity that the fragments are attached to. You need to then manage the visibility of the google map. As it will remain on top of other fragments.
By controlling the visibility of the framelayouts, you control the visibility of the map within it's framelayout.
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/
The Exception is happening in the Activity, due of findFragmentById
returning null. Accordingly to the code you posted, you have declared your Fragment
in your xml. Since you are using getSupportFragmentManager
, please make sure you declared it with com.google.android.gms.maps.SupportMapFragment
and not with com.google.android.gms.maps.MapFragment
. This could be one of the causes you are getting null. on The other hand you could use a transactin
private MapDemoActivity mFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
mFragment = new MapDemoActivity();
getSupportFragmentManager().beginTransaction().replace(R.id.container, mFragment, "TAG").commit();
}
}
and then you can use mFragment
. In your xml you have to replace your <fragment
with a normal ViewGroup, a FrameLayout
eg with id container
Hi you can try another way like Create a public static method in your fragment class and from your activity class On button click call this method with desired latitude and longitude.
/*
* Get User Desired Location in fragment class */
public static void getLocation(double lati, double longi)
{
try {
CameraUpdate center = CameraUpdateFactory.newLatLng(new LatLng(lati, longi));
CameraUpdate zoom = CameraUpdateFactory.zoomTo(15);
googleMap.moveCamera(center);
googleMap.animateCamera(zoom);
} catch (Exception e) {
e.printStackTrace();
}
}
/* Get Desired Location in your activity class*/
btnCurrentLocation.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
ClassName.getLocation(lati, longi);
}
});
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.