2011-11-16 13 views
5

मैं MapView को ActionBarTab में डालने का प्रयास कर रहा हूं, लेकिन मैं समस्या को हल करने में भी सक्षम नहीं था।FragmentMap + ActionBar Tab

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    //setContentView(R.layout.action_bar_tabs); 
    FragmentManager fm = getSupportFragmentManager(); 
    fm.beginTransaction().add(android.R.id.content, GigLoader.GigLoaderListFragment.newInstance()).commit(); 

    getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

    ActionBar.Tab tab1 = getSupportActionBar().newTab().setText("Geo").setTabListener(this); 
    ActionBar.Tab tab2 = getSupportActionBar().newTab().setText("Lista").setTabListener(this); 
    getSupportActionBar().addTab(tab1); 
    getSupportActionBar().addTab(tab2); 
} 

@Override 
public void onTabSelected(Tab tab, FragmentTransaction ft) { 
    if (tab.getPosition() == 0) { 
     fm.beginTransaction().add(android.R.id.content, GigLoader.GigLoaderListFragment.newInstance()).commit(); 
    } 
    else { 
     fm.beginTransaction().add(android.R.id.content, GeoGigLoader.GeoGigMapFragment.newInstance()).commit(); 
    } 

} 

और यहाँ GeoGigLoader का कोड:

यहाँ मुख्य गतिविधि है

public class GeoGigLoader extends FragmentMapActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);  
} 

public static final class GeoGigMapFragment extends Fragment { 

    static GeoGigMapFragment newInstance() { 
     GeoGigMapFragment map = new GeoGigMapFragment(); 
     return map; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = getActivity().getLayoutInflater().inflate(R.layout.map_gigs, container, false); 
     MapView mapView = (MapView)view.findViewById(R.id.map_view); 
     mapView.setBuiltInZoomControls(true); 
     return view; 
    } 

} 

@Override 
protected boolean isRouteDisplayed() { 
    return false; 
} 
} 

FragmentMapActivity actionbarsherlock.com से एक पुस्तकालय है, और यह एक एक MapActivity तक फैली हुई है, इसलिए यह काम करना चाहिए।

त्रुटि मैं मिलता है, अगले एक है:

FATAL EXCEPTION: main E/AndroidRuntime(954): android.view.InflateException: Binary XML file line #2: Error inflating class com.google.android.maps.MapView E/AndroidRuntime(954): at android.view.LayoutInflater.createView(LayoutInflater.java:513) E/AndroidRuntime(954): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:565)

किसी को पता है क्या हो रहा है?

उत्तर

4

समाधान मुख्य गतिविधि में मानचित्रदृश्य शुरू करना है जो FragmentMapActivity को बढ़ाया जाना चाहिए। फिर आपका टुकड़ा इसे मुख्य गतिविधि से प्राप्त करके मानचित्रदृश्य को कार्यान्वित कर सकता है।

मुख्य गतिविधि:

mMapView = new MapView(YourActivity.this, MAPS_KEY); 
    mMapView.setClickable(true); 
    Exchanger.mMapView = mMapView; 

टुकड़ा:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    mMapView = Exchanger.mMapView; 
    return mMapView; 
} 

@Override 
public void onDestroy() { 
    if(mMapView != null) { 
     NoSaveStateFrameLayout parentView = (NoSaveStateFrameLayout) mMapView.getParent(); 
     parentView.removeView(mMapView); 
    } 
    super.onDestroy(); 
} 

एक्सचेंजर उस में MapView के साथ एक स्थिर क्षेत्र के साथ एक वर्ग है।

+0

लेकिन मैं एक्सचेंजर मैप व्यू विशेषता कैसे घोषित कर सकता हूं ?? मैंने कभी भी एक्सचेंज क्लास – cesards

+0

एक्सचेंजर का उपयोग नहीं किया है, केवल एक वर्ग है जिसे मैंने स्वयं बनाया है, यह एक वर्ग है जिसमें केवल 1 स्थैतिक क्षेत्र mMapView है। – Warpzit

+0

बिल्कुल सही। हाँ मैंने वही किया। एक सिंगलटन एक :-) बहुत बहुत धन्यवाद! – cesards

1

एंड्रॉइड के लिए Google की मानचित्र API लाइब्रेरी अभी फ़्रेगमेंट का समर्थन नहीं करता है।

+0

लेकिन ऐसा करने के लिए कुछ चाल हैं। समस्या एक्शन बार + टैब का उपयोग कर रही है + मानचित्र – cesards

0

मैं इस शो/छिपाने तरीकों का उपयोग एक MapActivity में कई MapView बनाने से बचने के लिए:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    if (view == null) { 
     view = inflater.inflate(R.layout.fragment_geo, container, false); 
    } 
    return view; 
} 

जहां दृश्य:

 
public class TabFragment extends SherlockFragment { 

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

     ActionBar actionBar = getSherlockActivity().getSupportActionBar(); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

     actionBar.addTab(actionBar 
      .newTab() 
      .setText("List") 
      .setTabListener(
       new TabListener(((FragmentActivity) getActivity()), "listFragment", ListFragment.class))); 

     actionBar.addTab(actionBar 
      .newTab() 
      .setText("Map") 
      .setTabListener(
       new TabListener(((FragmentActivity) getActivity()), "MapFragment", MapFragment.class))); 
    } 

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

    public static class TabListener implements ActionBar.TabListener { 
     private final FragmentActivity activity; 
     private final String tag; 
     private final Class clazz; 
     private final Bundle args; 
     private Fragment fragment; 

     public TabListener(FragmentActivity activity, String tag, Class clz) { 
      this(activity, tag, clz, null); 
     } 

     public TabListener(FragmentActivity activity, String tag, Class clz, Bundle args) { 
      this.activity = activity; 
      this.tag = tag; 
      this.clazz = clz; 
      this.args = args; 

      // Check to see if we already have a fragment for this tab, probably from a previously saved state. If so, 
      // hide it, because our initial state is that a tab isn't shown. 
      fragment = activity.getSupportFragmentManager().findFragmentByTag(tag); 
      if (fragment != null && !fragment.isHidden()) { 
       FragmentTransaction ft = activity.getSupportFragmentManager().beginTransaction(); 
       ft.hide(fragment); 
       ft.commit(); 
      } 
     } 

     @Override 
     public void onTabSelected(Tab tab, FragmentTransaction ft) { 
      if (fragment == null) { 
       fragment = Fragment.instantiate(activity, clazz.getName(), args); 
       ft.add(R.id.container_fragment, fragment, tag); 
      } else { 
       ft.show(fragment); 
      } 
     } 

     @Override 
     public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
      if (fragment != null) { 
       ft.hide(fragment); 
      } 
     } 

     @Override 
     public void onTabReselected(Tab tab, FragmentTransaction ft) { 
     } 
    } 
} 
1

मैं इस मुद्दे onCreateView विधि बदलते समाधान कर लिया है ऑब्जेक्ट देखें।

संबंधित मुद्दे