2013-10-25 14 views
8

Ich entwickle eine App mit einem Menü oben mit einigen Schaltflächen in diesem Menü. Ich versuche Google Maps zu einem der Buttons hinzuzufügen, bin aber nicht sehr erfolgreich. Ich folgte this tutorial, aber anstatt google maps direkt in MainActivity zu implementieren, fügte ich sie in ein Fragment, das gestartet wird, wenn die Taste gedrückt wird. Alles hat gut funktioniert. Wenn ich den Knopf drücke, werden die Karten geladen und sie funktionieren wie sie sollten. Wenn ich die Home-Taste drücken, um MainActivity zurück zu gehen funktioniert es perfekt, aber wenn ich Karten laden will wieder gibt es mir debugging error: Class File Editor: Source not foundAndroid Google Maps in Fragment

Dies ist Code von GoogleMaps Fragmente:

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

Jede mögliche Hilfe geschätzt .

EDIT: Wenn ich nicht spezifisch genug war. Es funktioniert, wenn ich fragment einmal (zum ersten Mal) lade, aber es funktioniert nicht, wenn ich versuche, es erneut zu laden (zweites Mal).

EDIT v2: Ich fand tatsächlich Lösung selbst. Alles, was ich tun musste, war OnDestroyView Methode hinzufügen:

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

Danke trotzdem.

+0

i ANM vor dem gleichen Problem, ich habe hinzufügen 'onDestroyView()' Methode, aber es ist nicht zu helfen .. wenn du mir helfen kannst –

+0

Ich kann dir nicht helfen, wenn du dein Problem nicht erklärst und wenn ich den Code nicht sehe ... – Izak

+0

danke Izak aber ich habe das gelöst :) –

Antwort

1

Werfen Sie einen Blick auf meine Implementierung, die gut funktioniert und auch einige Überprüfung auf dem Gerät zu dosieren, bevor Sie versuchen, die Karte anzuzeigen, wie wenn die Google Play-Dienste installiert sind. Vielleicht wird es dir helfen. Ich verwende eine einfache FragmentActivity und inflationiere ein Layout, das ein SupportedMapFragment enthält.

Hier ist der Code:

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; 
     } 
    } 

und das entsprechende Layout:

<?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> 
+0

Ich wette, Ihr Code würde perfekt funktionieren, aber ich musste nur 'OnDestroyView' Methode enthalten. Danke trotzdem. – Izak

3
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> 
+0

Ihre Lösung hat für mich funktioniert! Vielen Dank – roccocullo