gpt4 book ai didi

java - 从 MainActivity 的 Button Click 中的 Fragment 访问方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:36:12 25 4
gpt4 key购买 nike

各位,

我正在尝试通过在 MainActivity 中单击按钮向 MapFragment(Fragment) 发送用户当前的纬度和经度。我使用在 MainActivity 中实现的 fragment 的接口(interface),但是当我尝试从 fragment onButtonClick 访问方法时,我得到一个

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)

我的代码在下面

这是 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));
*/
}

}

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


}

}

最佳答案

您没有使用谷歌地图。您需要在调用 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));

}

基本上,我会在 fragment 所附加的 Activity 中使用此方法。然后您需要管理谷歌地图的可见性。因为它将保留在其他 fragment 之上。
通过控制框架布局的可见性,您可以控制 map 在其框架布局内的可见性。

示例:

// 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/

关于java - 从 MainActivity 的 Button Click 中的 Fragment 访问方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33149561/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com