Android 在恢复片段时,我无法在地图中的某个位置查看标记和动画摄影机
我正在使用google maps-v2开发一个应用程序。一切都很好,但当我从一个贴图片段转到另一个片段,回到贴图片段时,它没有添加任何标记或设置相机动画 以下是片段的代码:Android 在恢复片段时,我无法在地图中的某个位置查看标记和动画摄影机,android,android-fragments,android-maps-v2,Android,Android Fragments,Android Maps V2,我正在使用google maps-v2开发一个应用程序。一切都很好,但当我从一个贴图片段转到另一个片段,回到贴图片段时,它没有添加任何标记或设置相机动画 以下是片段的代码: public class MapPane extends Fragment implements DirectionFinderListener { private static final int PERMISSION_REQUEST_CODE = 1; ProgressBar progressBar; // Googl
public class MapPane extends Fragment implements DirectionFinderListener {
private static final int PERMISSION_REQUEST_CODE = 1;
ProgressBar progressBar;
// Google Map
private static GoogleMap googleMap;
public static double latitude, longitude;
private Button btnFindPath;
private String sOrigin = "";
private String sDestination = "";
private List<Marker> originMarkers = new ArrayList<>();
private List<Marker> destinationMarkers = new ArrayList<>();
private List<Polyline> polylinePaths = new ArrayList<>();
private ProgressDialog progressDialog;
View v;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
// TODO Add your menu entries here
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.map_pane, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.m_directions) {
Fragment frag3 = new DirectionActivity();
android.support.v4.app.FragmentTransaction ft3 = getActivity().getSupportFragmentManager().beginTransaction();
ft3.replace(R.id.content_frame, frag3);
ft3.commit();
}
return super.onOptionsItemSelected(item);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
Log.e("MapPane", "onCreateView()");
v = inflater.inflate(R.layout.activity_maps, container, false);
progressBar = (ProgressBar) v.findViewById(R.id.progressBar);
sOrigin = getArguments().getString("source");
sDestination = getArguments().getString("destination");
Log.e("MapPane ", "Source: " + sOrigin + "Destination: " + sDestination);
Geocoder geocoder = new Geocoder(getActivity());
List<Address> addresses = null;
if (sOrigin.equals(null)) {
Toast.makeText(getActivity(), "Source is empty!", Toast.LENGTH_SHORT).show();
} else {
try {
addresses = geocoder.getFromLocationName(sOrigin, 1);
} catch (IOException e) {
e.printStackTrace();
}
if (addresses.size() > 0) {
latitude = addresses.get(0).getLatitude();
longitude = addresses.get(0).getLongitude();
Log.e("Location Coordinates ", String.valueOf(latitude) + " ," + String.valueOf(longitude));
}
}
btnFindPath = (Button) v.findViewById(R.id.btnFindPath);
progressDialog = new ProgressDialog(v.getContext());
progressDialog.setCancelable(false);
progressDialog.setMessage("Please wait...");
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
try {
// Loading map
initilizeMap();
} catch (Exception e) {
e.printStackTrace();
}
if (!checkPermission()) {
requestPermission();
} else {
zoomToOrigin();
}
btnFindPath.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendRequest();
}
});
return v;
}
private void zoomToOrigin() {
if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED) {
googleMap.setMyLocationEnabled(true);
} else {
// Show rationale and request permission.
}
googleMap.getUiSettings().setMyLocationButtonEnabled(true);
googleMap.getUiSettings().setZoomControlsEnabled(true);
CameraPosition cameraPosition = new CameraPosition.Builder().target(
new LatLng(latitude, longitude)).zoom(12).build();
googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
}
private boolean checkPermission() {
int result = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION);
if (result == PackageManager.PERMISSION_GRANTED) {
return true;
} else {
return false;
}
}
private void requestPermission() {
ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSION_REQUEST_CODE);
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case PERMISSION_REQUEST_CODE:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(getActivity(), "Permission Granted, Now you can access location data.", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getActivity(), "Permission Granted, Now you can access location data.", Toast.LENGTH_LONG).show();
}
break;
}
}
/**
* function to load map. If map is not created it will create it for you
*/
private void initilizeMap() {
if (googleMap == null) {
googleMap = ((MapFragment) getActivity().getFragmentManager().findFragmentById(
R.id.map)).getMap();
// check if map is created successfully or not
if (googleMap == null) {
Toast.makeText(getContext(),
"Sorry! unable to create maps", Toast.LENGTH_SHORT)
.show();
}
}
}
private void sendRequest() {
try {
new DirectionFinder(this, sOrigin, sDestination).execute();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
@Override
public void onResume() {
initilizeMap();
Log.e("MapPane", "onResume()" + latitude + " ," + longitude);
MarkerOptions marker = new MarkerOptions().position(new LatLng(latitude, longitude))
.title("Nagpur");
googleMap.addMarker(marker);
CameraPosition cameraPosition = new CameraPosition.Builder()
.target(new LatLng(latitude, longitude)).zoom(14).build();
googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
getView().setFocusableInTouchMode(true);
getView().requestFocus();
getView().setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) {
Fragment fragment = new BDashboard();
FragmentManager fm = getActivity().getSupportFragmentManager();
android.support.v4.app.FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.content_frame, fragment);
ft.commit();
return true;
}
return false;
}
});
super.onResume();
}
@Override
public void onDestroyView() {
Log.e("MapPane", "onDestroyView");
try {
MapFragment fragment = ((MapFragment) getActivity().getFragmentManager().findFragmentById(R.id.map));
FragmentTransaction ft = getActivity().getFragmentManager().beginTransaction();
ft.remove(fragment);
ft.commit();
} catch (Exception e) {
}
super.onDestroyView();
}
@Override
public void onDirectionFinderStart() {
progressDialog = ProgressDialog.show(getActivity(), "Please wait.",
"Finding direction..!", true);
if (originMarkers != null) {
for (Marker marker : originMarkers) {
marker.remove();
}
}
if (destinationMarkers != null) {
for (Marker marker : destinationMarkers) {
marker.remove();
}
}
if (polylinePaths != null) {
for (Polyline polyline : polylinePaths) {
polyline.remove();
}
}
}
@Override
public void onDirectionFinderSuccess(List<Route> routes) {
progressDialog.dismiss();
polylinePaths = new ArrayList<>();
originMarkers = new ArrayList<>();
destinationMarkers = new ArrayList<>();
for (Route route : routes) {
((TextView) v.findViewById(R.id.tvDuration)).setText(route.duration.text);
((TextView) v.findViewById(R.id.tvDistance)).setText(route.distance.text);
originMarkers.add(googleMap.addMarker(new MarkerOptions()
.icon(BitmapDescriptorFactory.fromResource(R.drawable.start_blue))
.title(route.startAddress)
.position(route.startLocation)));
destinationMarkers.add(googleMap.addMarker(new MarkerOptions()
.icon(BitmapDescriptorFactory.fromResource(R.drawable.end_green))
.title(route.endAddress)
.position(route.endLocation)));
PolylineOptions polylineOptions = new PolylineOptions().
geodesic(true).
color(Color.BLUE).
width(10);
for (int i = 0; i < route.points.size(); i++)
polylineOptions.add(route.points.get(i));
polylinePaths.add(googleMap.addPolyline(polylineOptions));
}
}
}
公共类映射窗格扩展片段实现DirectionFinderListener{
私有静态最终int权限\请求\代码=1;
ProgressBar ProgressBar;
//谷歌地图
私有静态谷歌地图;
公共静态双纬度、经度;
专用按钮btnFindPath;
私有字符串sOrigin=“”;
私有字符串sDestination=“”;
private List originMarkers=new ArrayList();
private List destinationMarkers=new ArrayList();
私有列表polylinepath=new ArrayList();
私有进程对话;
观点五;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
设置选项菜单(真);
}
@凌驾
创建选项菜单(菜单菜单,菜单充气机){
//TODO在此处添加菜单项
super.onCreateOptions菜单(菜单,充气机);
充气器。充气(右菜单。地图窗格,菜单);
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
int id=item.getItemId();
if(id==R.id.m_方向){
片段frag3=新方向活动();
android.support.v4.app.FragmentTransaction ft3=getActivity().getSupportFragmentManager().beginTransaction();
ft3.更换(R.id.content_框架,frag3);
ft3.commit();
}
返回super.onOptionsItemSelected(项目);
}
@可空
@凌驾
创建视图时的公共视图(LayoutFlater充气机、@Nullable ViewGroup容器、@Nullable Bundle savedInstanceState){
Log.e(“MapPane”、“onCreateView()”);
v=充气机。充气(R.layout.activity\u地图,容器,假);
progressBar=(progressBar)v.findViewById(R.id.progressBar);
sOrigin=getArguments().getString(“源”);
sDestination=getArguments().getString(“目标”);
Log.e(“地图窗格”,“源:+sOrigin+”目的:+sDestination”);
Geocoder Geocoder=新的地理编码器(getActivity());
列表地址=空;
if(sOrigin.equals(null)){
Toast.makeText(getActivity(),“源为空!”,Toast.LENGTH_SHORT.show();
}否则{
试一试{
地址=geocoder.getFromLocationName(sOrigin,1);
}捕获(IOE异常){
e、 printStackTrace();
}
如果(地址.size()>0){
纬度=地址。get(0)。getLatitude();
经度=地址。获取(0)。获取经度();
Log.e(“位置坐标”,String.valueOf(纬度)+”,“String.valueOf(经度));
}
}
btnFindPath=(按钮)v.findviewbyd(R.id.btnFindPath);
progressDialog=新建progressDialog(v.getContext());
progressDialog.setCancelable(假);
progressDialog.setMessage(“请稍候…”);
progressDialog.setProgressStyle(progressDialog.STYLE_水平);
试一试{
//装载图
initilizeMap();
}捕获(例外e){
e、 printStackTrace();
}
如果(!checkPermission()){
requestPermission();
}否则{
zoomToOrigin();
}
btnFindPath.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
sendRequest();
}
});
返回v;
}
私有void zoomToOrigin(){
if(ContextCompat.checkSelfPermission(getActivity()、Manifest.permission.ACCESS\u FINE\u位置)
==PackageManager.权限(已授予){
googleMap.setMyLocationEnabled(true);
}否则{
//说明理由并请求许可。
}
googleMap.getUiSettings().setMyLocationButtonEnabled(true);
googleMap.getUiSettings().setZoomControlsEnabled(true);
CameraPosition CameraPosition=新建CameraPosition.Builder().target(
新LatLng(纬度、经度)).zoom(12.build();
googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
}
私有布尔检查权限(){
int result=ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.ACCESS\u FINE\u LOCATION);
如果(结果==已授予PackageManager.PERMISSION){
返回true;
}否则{
返回false;
}
}
私有void requestPermission(){
ActivityCompat.requestPermissions(getActivity(),新字符串[]{Manifest.permission.ACCESS\u FINE\u LOCATION},permission\u REQUEST\u CODE);
}
@凌驾
public void onRequestPermissionsResult(int-requestCode,字符串权限[],int[]grantResults){
开关(请求代码){
案例权限\请求\代码:
if(grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION\u已授予){
Toast.makeText(getActivity(),“已授予权限,现在您可以访问位置数据了。”,Toast.LENGTH_LONG).show();
}否则{
Toast.makeText(getActivity(),“已授予权限,现在您可以访问位置数据了。”,Toast.LENGTH_LONG).show();
}
打破
}
}
/**
*函数加载映射。如果未创建映射,它将为您创建映射
*/
私有void initilizeMap(){
if(googleMap==null){
googleMap=((MapFragment)getActivity().getFragmentManager().findFragmentById(
R.id.map)).getMap();
//检查是否成功创建映射
if(googleMap==null){
Toast.makeText(getContext(),
“抱歉!无法创建地图”,Toast.LENGTH\u SHORT)
.show();
}
}
}
私有void sendRequest(){
试一试{
新的DirectionFinder(this,sOrigin,sdestinition).execute();
}捕获(不支持的编码异常e){
e、 printStackTrace();
}
}
@凌驾
恢复时公开作废(){
initilizeMap();
Log.e(“MapPane”、“onResume()”+纬度+”、“+经度”);
标记选项标记