【问题标题】:Android Google Maps in Fragment片段中的 Android 谷歌地图
【发布时间】:2013-11-04 04:46:10
【问题描述】:

我正在开发一个顶部有一个菜单的应用程序,该菜单内有一些按钮。我正在尝试将谷歌地图添加到其中一个按钮,但我不是很成功。我在关注this tutorial,但没有直接将谷歌地图实现到MainActivity,而是将它们添加到按下按钮时启动的片段中。一切正常。当我按下按钮时,地图会加载并且它们会正常工作。当我按下主页按钮返回MainActivity 时,它工作得很好,但是当我想再次加载地图时,它给了我debugging error: Class File Editor: Source not found

这是GoogleMaps片段的代码:

public class GoogleMaps extends Fragment{

private GoogleMap googleMap;
double latitude = 46.514249;
double longitude = 15.080183;

 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        final View myFragmentView = inflater.inflate(R.layout.maps_layout, container, false);

        try {
            // Loading map
            initilizeMap();

        } catch (Exception e) {
            Log.e("ERROR", "ERROR IN CODE: " + e.toString());
            e.printStackTrace();
        }

        return myFragmentView;
 }

 private void initilizeMap() {
        if (googleMap == null) {
            googleMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
            googleMap.addMarker(new MarkerOptions().position(new LatLng(latitude, longitude)));
            CameraPosition cameraPosition = new CameraPosition.Builder().target(
                    new LatLng(latitude, longitude)).zoom(12).build();
            googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
            // check if map is created successfully or not
            if (googleMap == null) {
                Toast.makeText(getActivity(),
                        "Sorry! unable to create maps", Toast.LENGTH_SHORT)
                        .show();
            }
       }
 }
}

任何帮助将不胜感激。

编辑: 如果我不够具体。当我加载fragment 一次(第一次)时它可以工作,但当我尝试再次加载它时它不起作用(第二次)。

编辑 v2: 我实际上自己找到了解决方案。 我所要做的就是添加OnDestroyView 方法:

public void onDestroyView() 
 {
         super.onDestroyView(); 
         Fragment fragment = (getFragmentManager().findFragmentById(R.id.map));  
         FragmentTransaction ft = getActivity().getFragmentManager().beginTransaction();
         ft.remove(fragment);
         ft.commit();
 }

还是谢谢。

【问题讨论】:

  • 我也面临同样的问题,我确实添加了onDestroyView() 方法,但它没有帮助.. 如果你能帮助我
  • 如果你不解释你的问题,如果我没有看到代码,我帮不了你......
  • 感谢 Izak,但我已经解决了。:)
  • 为我工作@Izak,非常感谢! :)
  • 它可以工作,但它在方向更改时崩溃。我该怎么办?请帮忙

标签: android google-maps fragment


【解决方案1】:
public class MapCurrentLoactionFragment extends Fragment {
    public static MapView mapView;

    public static GoogleMap map;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View v = inflater.inflate(R.layout.fragment_currentlocation_map,
                container, false);
          try
          {

        // Gets the MapView from the XML layout and creates it
        mapView = (MapView) v.findViewById(R.id.mapview);

        mapView.onCreate(savedInstanceState);
        mapView.onResume();
        // Gets to GoogleMap from the MapView and does initialization stuff
        map = mapView.getMap();
        // Changing map type
        map.setMapType(GoogleMap.MAP_TYPE_NORMAL);
        // googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        // googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
        // googleMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
        // googleMap.setMapType(GoogleMap.MAP_TYPE_NONE);

        // Showing / hiding your current location
        map.setMyLocationEnabled(false);

        // Enable / Disable zooming controls
        map.getUiSettings().setZoomControlsEnabled(true);

        // Enable / Disable my location button
        map.getUiSettings().setMyLocationButtonEnabled(true);

        // Enable / Disable Compass icon
        map.getUiSettings().setCompassEnabled(true);

        // Enable / Disable Rotate gesture
        map.getUiSettings().setRotateGesturesEnabled(true);

        // Enable / Disable zooming functionality
        map.getUiSettings().setZoomGesturesEnabled(true);

        MapsInitializer.initialize(this.getActivity());
      }
          catch(Exception e)
          {
              System.out.println(e);
          }
        return v;
    }

XML:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <com.google.android.gms.maps.MapView
         android:id="@+id/mapview"
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" />

</LinearLayout>

【讨论】:

    【解决方案2】:

    看看我的实现,它工作得很好,并且在尝试显示地图之前对设备进行一些检查,就像安装了谷歌播放服务一样。也许它会帮助你。我正在使用一个简单的 FragmentActivity 并膨胀包含 SupportedMapFragment 的布局。

    代码如下:

    public class LocationActivity extends FragmentActivity {
    
        private GoogleMap map;
        private long rec_id;
        private String address;
        private Marker selectedLoc;
        private boolean isSessionClosed;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            BugSenseHandler.initAndStartSession(this, Constants.BugSenseKEY);
            setContentView(R.layout.preview_location);
            RelativeLayout cancel_btn = (RelativeLayout) findViewById(R.id.cancel_btn);
            LinearLayout save_location_btn = (LinearLayout) findViewById(R.id.delete_btn);
    
            save_location_btn.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View v) {
    
                    if (address != null) {
                        ReceiptDataSource r = new ReceiptDataSource();
                        r.updateReceiptLocation(rec_id, address);
                        Intent returnIntent = new Intent(getBaseContext(), EditReceiptActivity.class);
                        returnIntent.putExtra("result", address);
                        setResult(RESULT_OK, returnIntent);
                        finish();
                    } else {
                        Utils.showToast(getApplicationContext(), getString(R.string.c_unknownLocation), Toast.LENGTH_SHORT);
                    }
                }
            });
    
            cancel_btn.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    onBackPressed();
                }
            });
    
            if (map == null) {
    
                map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
    
                if (isGoogleMapsInstalled()) {
                    if (map != null) {
                        retrieveLocation();
                    }
                } else {
                    AlertDialog.Builder builder = new AlertDialog.Builder(this);
                    builder.setMessage("Install Google Maps");
                    builder.setCancelable(false);
                    builder.setPositiveButton("Install", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=com.google.android.apps.maps"));
                            startActivity(intent);
    
                            //Finish the activity so they can't circumvent the check
                            finish();
                        }
                    });
                    AlertDialog dialog = builder.create();
                    dialog.show();
                }
            }
    
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            if (isSessionClosed) {
                BugSenseHandler.startSession(this);
                isSessionClosed = false;
            }
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            BugSenseHandler.closeSession(this);
            isSessionClosed = true;
        }
    
        @Override
        public void onBackPressed() {
            map.clear();
            super.onBackPressed();
        }
    
        private void retrieveLocation() {
            Intent intent = getIntent();
            address = intent.getStringExtra("location");
            assert address != null;
            if (address.equalsIgnoreCase("")) {
                address = Utils.getCurrentLocation(LocationActivity.this);
            }
            rec_id = intent.getLongExtra("receipt_to_update_location", 0);
            final Geocoder geocoder = new Geocoder(this, Locale.US);
            double latitude = 0, longitude = 0;
            try {
                List<Address> loc = geocoder.getFromLocationName(address, 5);
                if (loc.size() > 0) {
                    latitude = loc.get(0).getLatitude();
                    longitude = loc.get(0).getLongitude();
                } else {
                    //Toast.makeText(getBaseContext(), getResources().getString(R.string.UnableToFindLocation),Toast.LENGTH_SHORT).show();
                    Utils.showToast(LocationActivity.this, getString(R.string.UnableToFindLocation), Toast.LENGTH_SHORT);
                }
    
    
                selectedLoc = map.addMarker(new MarkerOptions().position(new LatLng(latitude, longitude)).title(address).draggable(true));
                map.setOnMarkerDragListener(new GoogleMap.OnMarkerDragListener() {
                    @Override
                    public void onMarkerDragStart(Marker marker) {
    
                    }
    
                    @Override
                    public void onMarkerDrag(Marker marker) {
    
                    }
    
                    @Override
                    public void onMarkerDragEnd(Marker marker) {
                        try {
                            List<Address> addresses = geocoder.getFromLocation(selectedLoc.getPosition().latitude, selectedLoc.getPosition().longitude, 1);
                            StringBuilder sb = new StringBuilder();
                            if (addresses.size() > 0) {
                                Address address = addresses.get(0);
    
                                if (address.getAddressLine(0) != null)
                                    sb.append(address.getAddressLine(0)).append(", ");
                                if (address.getLocality() != null)
                                    sb.append(address.getLocality()).append(", ");
                                if (address.getCountryName() != null)
                                    sb.append(address.getCountryName());
                            }
    
                            address = sb.toString();
                        } catch (IOException e) {
                        }
    
                    }
                });
    
                map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(latitude, longitude), 12));
    
                // Zoom in, animating the camera.
                map.animateCamera(CameraUpdateFactory.zoomTo(12), 2000, null);
    
            } catch (IOException e) {
                Log.e("IOException", e.getMessage());
                //Toast.makeText(this, getString(R.string.c_unknownLocation), Toast.LENGTH_LONG).show();
                Utils.showToast(LocationActivity.this, getString(R.string.c_unknownLocation), Toast.LENGTH_LONG);
            }
    
        }
    
        public boolean isGoogleMapsInstalled() {
            try {
                ApplicationInfo info = getPackageManager().getApplicationInfo("com.google.android.apps.maps", 0);
                return true;
            } catch (PackageManager.NameNotFoundException e) {
                return false;
            }
        }
    

    以及对应的布局:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  xmlns:custom="http://schemas.android.com/apk/res/ro.gebs.captoom"
                  android:id="@+id/location_stuff"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent"
                  android:background="@color/greenish"
                  android:orientation="vertical">
    
        <RelativeLayout
                android:id="@+id/location_header"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1"
                android:background="@color/greenish">
    
            <RelativeLayout
                    android:id="@+id/cancel_btn"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentLeft="true"
                    android:layout_centerVertical="true"
                    android:layout_marginLeft="20dp"
                    android:background="@drawable/done_rounded_btn"
                    android:gravity="center">
    
                <ro.gebs.captoom.utils.fonts.CustomFontTextView
                        android:id="@+id/retake_txt"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_centerInParent="true"
                        android:layout_marginTop="10dp"
                        android:gravity="center"
                        android:paddingLeft="7dp"
                        android:paddingRight="7dp"
                        android:text="@string/cancel"
                        android:textAllCaps="true"
                        android:textColor="#FFFFFF"
                        android:textSize="14sp"
                        custom:fontName="Bold"/>
            </RelativeLayout>
    
            <ro.gebs.captoom.utils.fonts.CustomFontTextView
                    android:id="@+id/location_txt"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_centerHorizontal="true"
                    android:layout_centerVertical="true"
                    android:gravity="center_vertical"
                    android:text="@string/location_map"
                    android:textAllCaps="true"
                    android:textColor="@color/done_color"
                    android:textSize="16sp"
                    custom:fontName="SemiBold"/>
        </RelativeLayout>
    
        <fragment
                android:layout_weight="6"
                android:id="@+id/map"
                android:layout_marginLeft="10dp"
                android:layout_marginRight="10dp"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                class="com.google.android.gms.maps.SupportMapFragment"/>
    
    
        <RelativeLayout
                android:id="@+id/save_location_layout"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1"
                android:background="@color/greenish">
    
            <LinearLayout
                    android:id="@+id/delete_btn"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_centerHorizontal="true"
                    android:layout_centerVertical="true"
                    android:layout_marginLeft="25dp"
                    android:layout_marginRight="25dp"
                    android:background="@drawable/done_btn_selector"
                    android:orientation="horizontal"
                    android:paddingBottom="7dip"
                    android:paddingTop="7dip"
                    android:weightSum="7">
    
                <ro.gebs.captoom.utils.fonts.CustomFontTextView
                        android:id="@+id/delete_txt"
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="6"
                        android:background="@null"
                        android:paddingLeft="10dp"
                        android:text="@string/save_location"
                        android:textAllCaps="true"
                        android:textColor="@color/white"
                        android:textSize="16sp"
                        custom:fontName="Bold"/>
    
                <ImageView
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center"
                        android:layout_weight="1"
    
                        android:paddingLeft="10dp"
                        android:paddingRight="10dp"
                        android:src="@drawable/input_map_white"/>
            </LinearLayout>
        </RelativeLayout>
    
    </LinearLayout>
    

    【讨论】:

    • 我敢打赌你的代码会完美运行,但我只需要包含OnDestroyView 方法。无论如何,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    • 2016-04-09
    相关资源
    最近更新 更多