Android 两个活动之间的沟通?
我正在制作一个应用程序,其中我正在使用谷歌地图。现在,我有一个关于MapActivity和ToursActivity之间通信的问题。为了简化它,我的应用程序是关于band Metallica的,我有一个旅游列表。当用户单击其中一个巡演时,它应该在该位置打开一个新的活动。我不会把ToursActivity放在这里,因为这里有一堆你不需要的代码。而且,如果这很重要的话,我会把我所有的数据都保存在Firebase上 这是我的地图活动:Android 两个活动之间的沟通?,android,android-intent,android-maps,Android,Android Intent,Android Maps,我正在制作一个应用程序,其中我正在使用谷歌地图。现在,我有一个关于MapActivity和ToursActivity之间通信的问题。为了简化它,我的应用程序是关于band Metallica的,我有一个旅游列表。当用户单击其中一个巡演时,它应该在该位置打开一个新的活动。我不会把ToursActivity放在这里,因为这里有一堆你不需要的代码。而且,如果这很重要的话,我会把我所有的数据都保存在Firebase上 这是我的地图活动: public class MapActivity extends
public class MapActivity extends AppCompatActivity implements OnMapReadyCallback {
private static final int REQUEST_LOCATION_PERMISSION = 10;
private GoogleMap.OnMapClickListener mCustomOnMapClickListener;
private GoogleMap mGoogleMap;
private MapFragment mMapFragment;
@BindView(R.id.lvTours) ListView lvTours;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tours_coord);
this.initialize();
lvTours.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
}
});
}
public void initialize(){
this.mMapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.fGoogleMap);
this.mMapFragment.getMapAsync(this);
this.mCustomOnMapClickListener = new GoogleMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng latLng) {
MarkerOptions newMarkerOptions = new MarkerOptions();
newMarkerOptions.icon(BitmapDescriptorFactory.fromResource(R.mipmap.tour));
newMarkerOptions.title("Tour");
newMarkerOptions.snippet("It' was here!");
newMarkerOptions.position(latLng);
mGoogleMap.addMarker(newMarkerOptions);
}
};
}
@Override
public void onMapReady(GoogleMap googleMap) {
this.mGoogleMap = googleMap;
UiSettings uiSettings = this.mGoogleMap.getUiSettings();
uiSettings.setZoomControlsEnabled(true);
uiSettings.setMyLocationButtonEnabled(true);
uiSettings.setZoomGesturesEnabled(true);
this.mGoogleMap.setOnMapClickListener(this.mCustomOnMapClickListener);
goToLocation(33.835293 , -117.914505);
}
public void goToLocation(double lat, double lng){
LatLng latLng = new LatLng(lat, lng);
CameraPosition position = CameraPosition.builder()
.target(latLng)
.zoom(16f)
.bearing(0.0f)
.tilt(0.0f)
.build();
mGoogleMap.animateCamera(CameraUpdateFactory.newCameraPosition(position),null);
}
private boolean hasLocationPermission() {
String LocationPermission = android.Manifest.permission.ACCESS_FINE_LOCATION;
int status = ContextCompat.checkSelfPermission(this, LocationPermission);
if (status == PackageManager.PERMISSION_GRANTED) {
this.mGoogleMap.setMyLocationEnabled(true);
return true;
}
return false;
}
private void requestPermission() {
String[] permission = new String[]{Manifest.permission.ACCESS_FINE_LOCATION};
ActivityCompat.requestPermissions(MapActivity.this, permission, REQUEST_LOCATION_PERMISSION);
}
}
公共类MapActivity扩展了AppCompatActivity在MapReadyCallback上的实现{
私有静态最终整数请求\位置\权限=10;
私有GoogleMap.OnMapClickListener mcustomamAppClickListener;
私有谷歌地图mGoogleMap;
私人地图碎片;
@BindView(R.id.lvTours)ListView lvTours;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.tours_coord);
这是初始化();
lvTours.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
}
});
}
公共无效初始化(){
this.mMapFragment=(MapFragment)getFragmentManager().findFragmentById(R.id.fGoogleMap);
this.mMapFragment.getMapAsync(this);
this.mcustomamapclicklistener=new GoogleMap.OnMapClickListener(){
@凌驾
公共无效的点击(LatLng LatLng){
MarkerOptions newMarkerOptions=新MarkerOptions();
图标(BitmapDescriptorFactory.fromResource(R.mipmap.tour));
newMarkerOptions.title(“巡演”);
newMarkerOptions.snippet(“它就在这里!”);
新标记选项位置(车床);
mGoogleMap.addMarker(newMarkerOptions);
}
};
}
@凌驾
4月1日公开作废(谷歌地图谷歌地图){
this.mGoogleMap=谷歌地图;
UiSettings UiSettings=this.mGoogleMap.getUiSettings();
uiSettings.setZoomControlsEnabled(true);
uiSettings.setMyLocationButtonEnabled(真);
uiSettings.setZoomGeturesEnabled(true);
this.mGoogleMap.setOnMapClickListener(this.mcustomanMapClickListener);
goToLocation(33.835293,-117.914505);
}
公共空间定位(双lat、双lng){
LatLng LatLng=新LatLng(lat,lng);
CameraPosition位置=CameraPosition.builder()
.目标(latLng)
.zoom(16f)
.轴承(0.0f)
.倾斜(0.0f)
.build();
mGoogleMap.animateCamera(CameraUpdateFactory.newCameraPosition(position),null);
}
私有布尔hasLocationPermission(){
String LocationPermission=android.Manifest.permission.ACCESS\u FINE\u位置;
int status=ContextCompat.checkSelfPermission(这是LocationPermission);
如果(状态==已授予PackageManager.PERMISSION){
this.mGoogleMap.setMyLocationEnabled(true);
返回true;
}
返回false;
}
私有void requestPermission(){
字符串[]权限=新字符串[]{Manifest.permission.ACCESS\u FINE\u LOCATION};
ActivityCompat.requestPermissions(MapActivity.this、权限、请求位置权限);
}
}
您可以将Intent与其他参数一起使用。
例如,在ToursActivity.java上
Intent intent = new Intent(ToursActivity.this, MapActivity.class);
intent.putExtra("lat", latitude);
intent.putExtra("long", longitude);
startActivity(intent);
然后您可以在MapActivity.java的onCreate()方法上获得以下参数:
Intent intent = getIntent();
long latitude = intent.getLongExtra("lat", 0);
long longitutde = intent.getLongExtra("long", 0);
可以将intent与其他参数一起使用
Intent intent = new Intent(ToursActivity.this, MapActivity.class);
intent.putExtra("latitude", latitude);
intent.putExtra("longitude", longitude);
startActivity(intent);
然后可以在MapActivity的onCreate()方法中获取值
Intent intent = getIntent();
Bundle extras = intent.getExtras();
double latitude = intent.getDouble("latitude");
double longitude = intent.getDouble("longitude");
您可以使用Intent和Bundle打开新活动并传递数据。谢谢你的快速回答。谢谢你的快速回答,但我还有一个问题。当我写入参数纬度和经度时,它们会变红,因为这些参数来自MapActivity。现在,在我的ToursFragment(不是ToursActivity,我的错误)中有一个方法onItemClick,我想在其中输入Intent,当你点击它时,它应该用一个Map打开一个新的活动你能把onItemClick代码放进去让我明白你的意思吗?@onItemClick(R.id.lvTours)public void onItemClick(View v,int position){Intent Intent Intent=new Intent(v.getContext(),MapActivity.class);Intent.putExtra(“纬度”,lat);Intent.putExtra(“经度”,lng);startActivity(意图);}}}我不知道我是否正确理解了您的问题,但问题是这样的。在MapActivity中,当您获得意图时,可以随意命名参数。如果这不是您问题的答案,请澄清“红色”的含义这是在哪里发生的。我会尽量解释得更好。我有Firebase上的旅游列表。该列表包含下一个参数:坐标、标题、id和年份。我知道如何在片段中显示这些数据以及所有这些。但是,我做了你所说的(有意),问题是当我输入参数时(ToursFragment.this,MapActivitiy)这两个得到红色下划线,它说:无法解析构造函数。现在,另一个问题在第二行代码中。当我输入经度时,它变成红色。