6

मैं टैब के साथ एक एप्लिकेशन बना रहा हूं और मेरे पास एक टैब में नक्शा है, जब से मैं इसे खोलता हूं ठीक काम करता है और जब मैं किसी अन्य टैब पर जाता हूं तो यह ठीक काम करता है , लेकिन जब मैं वापस मैप टैब ऐप पर वापस आ जाता हूं तो इस त्रुटि के साथ दुर्घटनाग्रस्त हो जाता है।Google मानचित्र V2 एंड्रॉइड त्रुटि वर्ग खंड त्रुटि

04-09 14:10:43.866: E/AndroidRuntime(28184): android.view.InflateException: Binary XML file line #42: Error inflating class fragment 
04-09 14:10:43.866: E/AndroidRuntime(28184): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:697) 
04-09 14:10:43.866: E/AndroidRuntime(28184): at android.view.LayoutInflater.rInflate(LayoutInflater.java:739) 
04-09 14:10:43.866: E/AndroidRuntime(28184): at android.view.LayoutInflater.rInflate(LayoutInflater.java:742) 
04-09 14:10:43.866: E/AndroidRuntime(28184): at android.view.LayoutInflater.inflate(LayoutInflater.java:489) 
04-09 14:10:43.866: E/AndroidRuntime(28184): at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 
04-09 14:10:43.866: E/AndroidRuntime(28184): at com.research.fragmenttabstudy.tabA.TodaysDealLocation.onCreateView(TodaysDealLocation.java:43) 

यहाँ मेरी कोड है:

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     Log.d("err","todaysdeal location"); 
     Log.d("err","todaysdeal location"+inflater.toString()+" "+container.toString()+" "); 
     super.onCreateView(inflater, container, savedInstanceState); 
//  map.clear(); 
     View view = inflater.inflate(R.layout.todays_deal_location, container, 
       false); 

     Log.d("err",view.toString()); 
     back = (ImageView) view.findViewById(R.id.list); 
     back.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       // TODO Auto-generated method stub 
       // Constants.passcode_chk = 0; 
       // finish(); 
       mActivity.popFragments(); 
      } 
     }); 
     return view; 
    } 
    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     map = ((SupportMapFragment) getFragmentManager().findFragmentById(
       R.id.mapp)).getMap(); 
     map.setMapType(GoogleMap.MAP_TYPE_NORMAL); 

    } 

xml:

map = ((SupportMapFragment) getFragmentManager().findFragmentById(R.id.mapp)).getMap(); 

:

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

    <ImageView 
     android:id="@+id/imageView1" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:src="@drawable/topbar" /> 

    <!-- <ImageView --> 
    <!-- android:id="@+id/deallistmenu" --> 
    <!-- android:layout_width="wrap_content" --> 
    <!-- android:layout_height="wrap_content" --> 
    <!-- android:layout_marginLeft="5dp" --> 
    <!-- android:layout_marginTop="9dp" --> 
    <!-- android:src="@drawable/deallist_menubtn" /> --> 

    <ImageView 
     android:id="@+id/list" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:layout_marginRight="7dp" 
     android:layout_marginTop="7dp" 
     android:src="@drawable/map_list" /> 

    <RelativeLayout 
     android:id="@+id/frameLayout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_below="@id/imageView1" 
     android:layout_marginTop="-4.8dp" > 

     <!-- box layout.................................................................... --> 


     <!-- box layout.................................................................... --> 

     <fragment 
      android:id="@+id/mapp" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_below="@+id/tv_location" 
      android:name="com.google.android.gms.maps.SupportMapFragment" /> 

     <!-- <ZoomControls --> 
     <!-- android:id="@+id/zoomControls" --> 
     <!-- android:layout_width="wrap_content" --> 
     <!-- android:layout_height="wrap_content" --> 
     <!-- android:layout_alignParentBottom="true" --> 
     <!-- android:layout_alignParentLeft="true" --> 
     <!-- android:layout_marginBottom="30dp" --> 
     <!-- android:layout_marginLeft="100dp" /> --> 

    </RelativeLayout> 

    <TextView 
     android:id="@+id/barTitle" 
     android:layout_width="match_parent" 
     android:layout_height="50dp" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:gravity="center" 
     android:lines="1" 
     android:maxLines="1" 
     android:paddingLeft="50dip" 
     android:paddingRight="55dip" 
     android:singleLine="true" 
     android:text="" 
     android:textAppearance="?android:attr/textAppearanceMedium" 
     android:textColor="@android:color/white" 
     android:textSize="18dp" /> 

</RelativeLayout> 
+0

जांच लाइन 42। या यहां अपना एक्सएमएल पोस्ट करें .. –

उत्तर

-1

पहली समस्या मैं कोड आप प्रस्तुत के साथ यहाँ देख इस लाइन है आप SupportMapFragment ऑब्जेक्ट प्राप्त करने का प्रयास कर रहे हैं सामान्य FragmentManager का उपयोग कर। ये गलत है। SupportMapFragment वस्तु आपके पास SupportFragmentManager इस तरह उपयोग करने के लिए प्राप्त करने के लिए:

map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.mapp)).getMap(); 

लेकिन मेरा अनुमान है कि आप अभी experiance समस्याओं अभी तक इस गलती से प्राप्त नहीं कर रहे हैं। मुझे लगता है कि आप लाइब्रेरी को google-support-v4 लाइब्रेरी का गलत तरीका बताते हैं।

आप इस ब्लॉग पोस्ट पर एक नज़र मैं कैसे आप आवेदन करने के लिए Google Map API V2 जोड़ने के बारे में लिखा है ले जा सकते हैं:

Google Map API V2

अद्यतन:

अगर आप मिनट एसडीके 11 तो है आप कर सकते हैं इस कोड में खंड बदलें:

<fragment 
     android:id="@+id/mapp" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_below="@+id/tv_location" 
     android:name="com.google.android.gms.maps.MapFragment" /> 
+0

लेकिन, यहां एमिल मैं खंड का विस्तार कर रहा हूं इसलिए मैं getSupportFragmentManager() का उपयोग नहीं कर सकता। –

+0

फिर SupportMapFragment के बजाय MapFragment का एक उदाहरण प्राप्त करें। –

+0

किस मिनी एसडीके के लिए आप आवेदन लिख रहे हैं? –

0

सुनिश्चित करें कि आपकी गतिविधि exte एनडीएस टुकड़ा गतिविधि और

map=((SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map)).getMap(); 

की जगह है और इस के साथ "android:layout_below="@+id/tv_location" because it is inside relative layout"

जाओ हटाने और मुझे पता है।

18

आपकी समस्या यह है कि आपने एक्सएमएल में Google मानचित्र v2 खंड को घोषित कर दिया है, इसलिए हर बार जब आप एक्सएमएल को बढ़ाते हैं तो यह एक नया टुकड़ा बनाता है। हालांकि, एक्सएमएल में टुकड़े की आईडी हार्ड-कोड की गई है, इसलिए यह उसी आईडी के साथ नया टुकड़ा बनाने की कोशिश करेगा जो पहले से चल रहा है। दो चलने वाले टुकड़े एक ही आईडी नहीं हो सकते हैं, इसलिए ऐप दुर्घटनाग्रस्त हो जाता है।

इसे ठीक करने का सबसे अच्छा तरीका नक्शा खंड को प्रोग्रामेटिक रूप से बनाना है। इसका एक अच्छा उदाहरण Google मानचित्र उदाहरण प्रोजेक्ट के ProgrammaticDemoActivity.java भाग में पाया जा सकता है।

हालांकि, अगर किसी कारण से आपको एक्सएमएल में अपना टुकड़ा घोषित करना होगा, तो आप दृश्य छोड़ते समय पुराने मानचित्र खंड को मार कर इसे काम कर सकते हैं, इसलिए नया बनाया जा सकता है।

आप की तरह कुछ कर सकते हैं:

private void killOldMap() { 
    SupportMapFragment mapFragment = ((SupportMapFragment) getSherlockActivity() 
      .getSupportFragmentManager().findFragmentById(R.id.map)); 

    if(mapFragment != null) { 
     FragmentManager fM = getFragmentManager(); 
     fM.beginTransaction().remove(mapFragment).commit(); 
    } 

} 

और फिर onDetach() और onDestroyView() से इसे कहते सुनिश्चित करने के लिए पुराने नक्शे मार दिया जाता है।

जैसा कि आप देख सकते हैं, यह एक हैक है और आप एक्सएमएल का उपयोग करने के बजाए प्रोग्रामिंग के जरिये प्रोग्रामिंग के जरिये सबसे अच्छे हैं।

+0

मेरे लिए काम नहीं करता – tsil

+0

धन्यवाद! मैंने इस पर कुछ घंटे बिताए हैं। – anil

+2

यह IllegalStateException का कारण बनता है क्योंकि हम SaveInstance() के बाद खंड की स्थिति को बदलने की कोशिश करेंगे! हैक काम नहीं करता है! –

2

इस प्रयास करें ...

कॉल onDetach() और onDestroyView से इस समारोह() टुकड़ा लेन-देन मौजूद मारने के लिए।(): "OnSaveInstanceState के बाद इस क्रिया को निष्पादित नहीं किया जा सकता IllegalStateException" अगर आप प्रतिबद्ध नक्शा लेन-देन मौजूद

private void commitMaps() { 
    if (null != mapFragment) { 
     getFragmentManager().beginTransaction().remove(mapFragment).commitAllowingStateLoss(); 
    } 
} 

कभी कभी आप मिल जाएगा। इस अपवाद से बचने के लिए आपको प्रतिबद्ध लेनदेन को हटाते समय प्रतिबद्धAllowingStateLoss() का उपयोग करना चाहिए। commit() and commitAllowingStateLoss()

0

एक नक्शा टुकड़ा के बीच

अंतर पहले से ही बनाया जाता है, और जब आप वापस नक्शा पेज को पाने के लिए कोशिश कर रहे हैं, अपने सब के ऊपर एक और टुकड़ा बनाने के लिए कोशिश कर रहा। कोड के नीचे अंत में मेरे लिए ठीक काम कर रहा है:

एक्सएमएल:

<fragment 
 
     xmlns:android="http://schemas.android.com/apk/res/android" 
 
     xmlns:tools="http://schemas.android.com/tools" 
 
     android:layout_width="match_parent" 
 
     android:layout_height="match_parent" 
 
     android:id="@+id/map" 
 
     android:name="com.google.android.gms.maps.SupportMapFragment"/>

कृपया ध्यान दें कि मैं SupportMapFragment बजाय MapFragment इस्तेमाल किया है।

जावा: अपने xml में

@Override 
public void onDestroyView() { 
    super.onDestroyView(); 
    Fragment f = getActivity().getSupportFragmentManager().findFragmentById(R.id.map); 
    if (f != null) 
     getFragmentManager().beginTransaction().remove(f).commit(); 
} 
संबंधित मुद्दे