2014-12-09 41 views
6

Şu anda birden fazla fragman kullandığım, ancak aynı anda birden çok parçayı kullandım, ancak uygulamada ilk kez yüklendiğimde sorun olur. Ancak, uygulamanız çöküyorsa, yasadışı argüman istisnası gösteriliyor.App android içinde fragman içinde harita kullanıldığında geri basıldığında çöküyor?

Mapfragment.java

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 

import org.json.JSONObject; 

import com.compass.DirectionsJSONParser; 
import com.compass.GPSTracker; 
import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.MapsInitializer; 
import com.google.android.gms.maps.SupportMapFragment; 
import com.google.android.gms.maps.model.BitmapDescriptorFactory; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.MarkerOptions; 
import com.google.android.gms.maps.model.PolylineOptions; 
import android.graphics.Color; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

public class MapFragment extends Fragment { 

    GoogleMap googlemap; 
    GPSTracker gps; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.fragment_map,container,false); 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     setRetainInstance(true); 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     gps=new GPSTracker(getActivity()); 
     googlemap = ((SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.mapviews)).getMap(); 
     MapsInitializer.initialize(getActivity().getApplicationContext()); 

     // current location 
     double currentlat=gps.getLatitude(); 
     double currentlon=gps.getLongitude(); 

     // destination location 
     //double destlat=23.048854; 
     //double destlon=72.516059; 

     double destlat=22.9833; 
     double destlon=72.5000; 

     final LatLng currentpoint = new LatLng(currentlat,currentlon); 
     final LatLng destinationpoint = new LatLng(destlat,destlon); 

     // fro add marker on map 
     googlemap.addMarker(new MarkerOptions() 
       .position(new LatLng(currentlat, currentlon)) 
       .title("Current Location") 
       .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_source))); 

     googlemap.animateCamera(CameraUpdateFactory.zoomTo(237.0f)); 
     googlemap.moveCamera(CameraUpdateFactory.newLatLng(currentpoint)); 

     googlemap.addMarker(new MarkerOptions() 
     .position(new LatLng(destlat, destlon)) 
     .title("WebOffice") 
     .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_destination))); 

     /* 
     String url = getDirectionsUrl(currentpoint, destinationpoint);    
     DownloadTask downloadTask = new DownloadTask(); 

     // Start downloading json data from Google Directions API 
     downloadTask.execute(url); 
     */ 

    } 

fragment_map.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <fragment 
     android:id="@+id/mapviews" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     class="com.google.android.gms.maps.SupportMapFragment" /> 

</LinearLayout> 

Logcat

12-09 11:48:05.165: E/AndroidRuntime(9701): FATAL EXCEPTION: main 
    12-09 11:48:05.165: E/AndroidRuntime(9701): Process: com.weboffice, PID: 9701 
    12-09 11:48:05.165: E/AndroidRuntime(9701): android.view.InflateException: Binary XML file line #7: Error inflating class fragment 
    12-09 11:48:05.165: E/AndroidRuntime(9701):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:713) 
    12-09 11:48:05.165: E/AndroidRuntime(9701):  at android.view.LayoutInflater.rInflate(LayoutInflater.java:755) 
    12-09 11:48:05.165: E/AndroidRuntime(9701):  at android.view.LayoutInflater.inflate(LayoutInflater.java:492) 
    12-09 11:48:05.165: E/AndroidRuntime(9701):  at android.view.LayoutInflater.inflate(LayoutInflater.java:397) 
    12-09 11:48:05.165: E/AndroidRuntime(9701):  at com.weboffice.MapFragment.onCreateView(MapFragment.java:45) 
    12-09 11:48:05.165: E/AndroidRuntime(9701):  at android.support.v4.app.Fragment.performCreateView(Fragment.java:1500) 
    12-09 11:48:05.165: E/AndroidRuntime(9701):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:938) 
    12-09 11:48:05.165: E/AndroidRuntime(9701):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1115) 
    12-09 11:48:05.165: E/AndroidRuntime(9701):  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 
    12-09 11:48:05.165: E/AndroidRuntime(9701):  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1478) 
    12-09 11:48:05.165: E/AndroidRuntime(9701):  at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:446) 
    12-09 11:48:05.165: E/AndroidRuntime(9701):  at android.os.Handler.handleCallback(Handler.java:733) 
    12-09 11:48:05.165: E/AndroidRuntime(9701):  at android.os.Handler.dispatchMessage(Handler.java:95) 
    12-09 11:48:05.165: E/AndroidRuntime(9701):  at android.os.Looper.loop(Looper.java:136) 
    12-09 11:48:05.165: E/AndroidRuntime(9701):  at android.app.ActivityThread.main(ActivityThread.java:5017) 
    12-09 11:48:05.165: E/AndroidRuntime(9701):  at java.lang.reflect.Method.invokeNative(Native Method) 
    12-09 11:48:05.165: E/AndroidRuntime(9701):  at java.lang.reflect.Method.invoke(Method.java:515) 
    12-09 11:48:05.165: E/AndroidRuntime(9701):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
    12-09 11:48:05.165: E/AndroidRuntime(9701):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
    12-09 11:48:05.165: E/AndroidRuntime(9701):  at dalvik.system.NativeStart.main(Native Method) 
    12-09 11:48:05.165: E/AndroidRuntime(9701): Caused by: java.lang.IllegalArgumentException: Binary XML file line #7: Duplicate id 0x7f0b005c, tag null, or parent id 0x0 with another fragment for com.google.android.gms.maps.SupportMapFragment 
    12-09 11:48:05.165: E/AndroidRuntime(9701):  at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:296) 
    12-09 11:48:05.165: E/AndroidRuntime(9701):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:685) 
    12-09 11:48:05.165: E/AndroidRuntime(9701):  ... 19 more 
+1

: Eğer GoogleMap nesneyi almak için buna ihtiyacınız olacak gibi

mMapFragment = SupportMapFragment.newInstance(); FragmentTransaction fragmentTransaction = getChildFragmentManager().beginTransaction(); fragmentTransaction.add(R.id.map_root, mMapFragment); fragmentTransaction.commit(); 

bu SupportMapFragment mMapFragment tutun. – Raghunandan

+1

Geri tuşuna bastığınızda Parçayı kaldırmanız gerekiyor .. 'onDestroyView (....) ' –

+0

bir kez açıldığında ikinci kez açıldığında tekrar çökecek ve aynı hatayı gösterecek – Mahesh

cevap

13

kullanımı bu kod

@Override 
public void onDestroyView() {  
    super.onDestroyView(); 

    try { 
     Fragment fragment = (getFragmentManager() 
       .findFragmentById(R.id.map)); 
     FragmentTransaction ft = getActivity().getSupportFragmentManager() 
       .beginTransaction(); 
     ft.remove(fragment); 
     ft.commit(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

ve bu

+0

teşekkürler bana çalışıyor – Mahesh

+0

Hey ikinci açtığınızda – Mahesh

+0

çökecek bir sorun geliyor ne zaman olur .. ?? uyandıktan sonra ur app devam ederken .. ?? –

0

da yerine düzeninde SupportMapFragment de beyan bu

@Override 
    public void onDestroyView() { 
     try{ 
      SupportMapFragment fragment = ((SupportMapFragment) getFragmentManager().findFragmentById(R.id.mapviews)); 
      FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction(); 
      ft.remove(fragment); 
      ft.commit(); 
      }catch(Exception e){ 
      } 

     super.onDestroyView(); 
    } 
2

gibi çalışmasına yardımcı olur, bu kadar ans işaretlemek, programlama yoluyla yapmak ve parçayı oluşturmak için klasik getFragmentManager() yerine getChildFragmentMananger kullandığınızdan emin olun. Bir parçanın içine fragmanı kullanılarak

GoogleMap map = mMapFragment.getMap(); 
+0

ama bunu kullanırsam 12-09 18: 23: 40.805: E/AndroidRuntime (15529): Neden: java.lang.NullPointerException: name == null – Mahesh

+0

Evet, harita başlatılmadan önce bir çalışma için beklemeniz gerekiyor. Haritaya 10 milisaniyeden sonra referans almak için bir gecikme işleyicisi kullanıyorum, alternatif olarak yaşam döngüsünü kendi yararınıza kullanın. Örneğin, onCreate'da parçayı verin ve ondan sonra onResume'de haritaya bir referans alın. - –

İlgili konular