2013-10-25 18 views
8

私はそのメニューの中にいくつかのボタンがある上にメニューを持つアプリケーションを開発しています。ボタンの1つにGoogleマップを追加しようとしていますが、それほど成功していません。私はthis tutorialに従っていましたが、implementig googleの代わりにMainActivityに直接マップしました。私はボタンを押すと起動されるフラグメントにそれらを追加しました。すべて正常に働いた。ボタンを押すと地図が読み込まれ、必要なときに機能します。私は戻ってMainActivityに行くためにホームボタンを押すと、それは完璧に動作しますが、私は再びマップをロードするとき、それは私にdebugging error: Class File Editor: Source not foundAndroidのGoogleマップの断片

を与えます。これは、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を一度(初めて)読み込むと機能しますが、もう一度読み込むと機能しません(2回目)。

EDIT v2: 実際に自分で解決策を見つけました。

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

とにかく感謝: 私がしなければならなかったすべてはOnDestroyViewメソッドを追加することでした。

+0

、私は 'onDestroyView()'メソッドを追加しましたが、それは助けていません..あなたが私を助けることができる場合 –

+0

あなたの問題を説明していない場合、私はコードを参照していない場合は、私はあなたを助けることができません... – Izak

+0

感謝イザックしかし、私はそれを解決しました:) –

答えて

1

Googleのサービスがインストールされているかのように地図を表示しようとする前に、うまく機能し、デバイスで何らかのチェックをしています。多分あなたを助けるでしょう。私は、単純な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; 
     } 
    } 

とそれに対応するレイアウト:

は、ここでは、コードです私は同じ問題に直面してANM

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

あなたのコードは完全にうまくいくはずですが、 'OnDestroyView'メソッドをインクルードするだけでした。とにかくありがとう。 – 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

あなたのソリューションは私のために働いた!ありがとう – roccocullo

関連する問題