27

के साथ एक्शनबारशरलॉक का उपयोग करना मैं एक्शनबार शेरलॉक का उपयोग कर रहा हूं लेकिन एक प्रश्न है जो मुझे वापस पकड़ रहा है।नया समर्थन मैपफ्रैगमेंट

तो अपने आवेदन पूरी तरह से पीछे की ओर एपीआई स्तर 7.

मैं अपने आवेदन में नए Google मानचित्र को लागू करने और है कि मैं SupportMapFragment वर्ग उपयोग करने की आवश्यकता क्या करने की जरूरत के लिए संगत की जरूरत है।

** मेरे प्रश्न **

यह ActionBarSherlock साथ SupportMapFragment वर्ग का उपयोग करना संभव है?

अग्रिम

संपादित करें धन्यवाद

मैं डाउनलोड और पुस्तकालय पर एक नज़र पड़ा है। विस्तारित Fragments में केवल परिवर्तन ही देख सकते हैं कि वे सभी के लिए बहुत सरल हैं और वही हैं।

क्या आपको लगता है कि मैं स्वयं समर्थन जोड़ सकता हूं?

यहां बताया गया है कि वे कैसे समर्थित हैं।

package com.actionbarsherlock.app; 

import android.app.Activity; 
import android.support.v4.app.DialogFragment; 
import com.actionbarsherlock.internal.view.menu.MenuItemWrapper; 
import com.actionbarsherlock.internal.view.menu.MenuWrapper; 
import com.actionbarsherlock.view.Menu; 
import com.actionbarsherlock.view.MenuInflater; 
import com.actionbarsherlock.view.MenuItem; 

import static com.actionbarsherlock.app.SherlockFragmentActivity.OnCreateOptionsMenuListener; 
import static com.actionbarsherlock.app.SherlockFragmentActivity.OnOptionsItemSelectedListener; 
import static com.actionbarsherlock.app.SherlockFragmentActivity.OnPrepareOptionsMenuListener; 

public class SherlockDialogFragment extends DialogFragment implements OnCreateOptionsMenuListener, OnPrepareOptionsMenuListener, OnOptionsItemSelectedListener { 
    private SherlockFragmentActivity mActivity; 

public SherlockFragmentActivity getSherlockActivity() { 
    return mActivity; 
} 

@Override 
public void onAttach(Activity activity) { 
    if (!(activity instanceof SherlockFragmentActivity)) { 
     throw new IllegalStateException(getClass().getSimpleName() + " must be attached to a SherlockFragmentActivity."); 
    } 
    mActivity = (SherlockFragmentActivity)activity; 

    super.onAttach(activity); 
} 

@Override 
public void onDetach() { 
    mActivity = null; 
    super.onDetach(); 
} 

@Override 
public final void onCreateOptionsMenu(android.view.Menu menu, android.view.MenuInflater inflater) { 
    onCreateOptionsMenu(new MenuWrapper(menu), mActivity.getSupportMenuInflater()); 
} 

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    //Nothing to see here. 
} 

@Override 
public final void onPrepareOptionsMenu(android.view.Menu menu) { 
    onPrepareOptionsMenu(new MenuWrapper(menu)); 
} 

@Override 
public void onPrepareOptionsMenu(Menu menu) { 
    //Nothing to see here. 
} 

@Override 
public final boolean onOptionsItemSelected(android.view.MenuItem item) { 
    return onOptionsItemSelected(new MenuItemWrapper(item)); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    //Nothing to see here. 
    return false; 
} 

}

उत्तर

61

यह एक आकर्षण की तरह सभी कार्यों, मुख्य रूप से ActionBarSherlock

पर जैक के महान काम करने के लिए धन्यवाद ये कदम उठाएँ मैं पीछा कर रहे हैं:

  1. अपने actiobarsherlock पुस्तकालय परियोजना में एक SherlockMapFragment वर्ग बनाएँ। मैं बस SherlockFragment की एक प्रतिलिपि बना क्योंकि मैं भी के लिए setHasOptionsMenu(true)
  2. गतिविधि फैली SherlockFragmentActivity (हमेशा की तरह)
  3. टुकड़ा फैली नव निर्मित SherlockMapFragment
  4. ActionBarSherlock नई google-play-services_lib पुस्तकालय की आवश्यकता है समर्थन की जरूरत
  5. आपका परियोजना की आवश्यकता है एक्शनबार शेरलॉक लाइब्रेरी। Google- play-Services को फिर से शामिल करने या Google API के विरुद्ध बनाने की आवश्यकता नहीं है।
  6. ग्राहम ने mentionned रूप में, आप एपीआई 7 उपकरणों के लिए समर्थन छोड़ करना होगा: <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" />

और यहाँ एक अधिक विस्तृत विवरण के लिए कुछ कोड है:

SherlockMapFragment

package com.actionbarsherlock.app; 

import com.actionbarsherlock.internal.view.menu.MenuItemWrapper; 
import com.actionbarsherlock.internal.view.menu.MenuWrapper; 
import com.actionbarsherlock.view.Menu; 
import com.actionbarsherlock.view.MenuInflater; 
import com.actionbarsherlock.view.MenuItem; 
import com.google.android.gms.maps.SupportMapFragment; 

import android.app.Activity; 
import android.support.v4.app.Watson.OnCreateOptionsMenuListener; 
import android.support.v4.app.Watson.OnOptionsItemSelectedListener; 
import android.support.v4.app.Watson.OnPrepareOptionsMenuListener; 

public class SherlockMapFragment extends SupportMapFragment 
     implements OnCreateOptionsMenuListener, 
     OnPrepareOptionsMenuListener, 
     OnOptionsItemSelectedListener { 
    private SherlockFragmentActivity mActivity; 

    public SherlockFragmentActivity getSherlockActivity() { 
     return mActivity; 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     if (!(activity instanceof SherlockFragmentActivity)) { 
      throw new IllegalStateException(getClass().getSimpleName() 
        + " must be attached to a SherlockFragmentActivity."); 
     } 
     mActivity = (SherlockFragmentActivity) activity; 

     super.onAttach(activity); 
    } 

    @Override 
    public void onDetach() { 
     mActivity = null; 
     super.onDetach(); 
    } 

    @Override 
    public final void onCreateOptionsMenu(android.view.Menu menu, android.view.MenuInflater inflater) { 
     onCreateOptionsMenu(new MenuWrapper(menu), mActivity.getSupportMenuInflater()); 
    } 

    @Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     // Nothing to see here. 
    } 

    @Override 
    public final void onPrepareOptionsMenu(android.view.Menu menu) { 
     onPrepareOptionsMenu(new MenuWrapper(menu)); 
    } 

    @Override 
    public void onPrepareOptionsMenu(Menu menu) { 
     // Nothing to see here. 
    } 

    @Override 
    public final boolean onOptionsItemSelected(android.view.MenuItem item) { 
     return onOptionsItemSelected(new MenuItemWrapper(item)); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Nothing to see here. 
     return false; 
    } 
} 

गतिविधि:

public class MainActivity extends SherlockFragmentActivity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 
} 

गतिविधि एक्सएमएल लेआउट:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/root" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" > 

    <fragment 
     android:id="@+id/fragment_map" 
     android:name=".ui.fragments.MapFragment" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:tag="tag_fragment_map" /> 

    <fragment 
     android:id="@+id/fragment_help" 
     android:name=".ui.fragments.HelpFragment" 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:tag="tag_fragment_help" /> 
</FrameLayout> 

नक्शा टुकड़ा:

public class MapFragment extends SherlockMapFragment { 
    private GoogleMap mMap; 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View root = super.onCreateView(inflater, container, savedInstanceState); 
     mMap = getMap(); 
     return root; 
    } 
} 
+6

मैंने यह भी किया और यह ठीक काम करता है। यदि आप एबीएस लाइब्रेरी प्रोजेक्ट के साथ गड़बड़ नहीं करना चाहते हैं तो आप अपने मुख्य प्रोजेक्ट में शेरलॉक मैपफ्रैगमेंट भी डाल सकते हैं। –

+0

सब कुछ किया और मैं आपको धन्यवाद देता हूं। अगली समस्या यह ठीक से काम करने के लिए हो रही है। नक्शे को पुनः प्राप्त करने के लिए कृपया मेरा अन्य प्रश्न देखें। http://stackoverflow.com/questions/13727992/google-maps-api-v2-failed-to-load-map-could-not-contact-google-servers/13728039#13728039 – StuStirling

+0

क्या आप जानते हैं इस कोड को हो सकता है अगर एंड्रॉइड मेवेन प्रोजेक्ट का उपयोग करते समय कोई समस्या है? मैंने एक ही कोड की कोशिश की और मुझे यहां त्रुटि की सूचना मिल रही है: http://stackoverflow.com/questions/14004668/google-maps-android-v2-not-working-with-actionbarsherlock-fragment-activity –

3

असल में क्या मुझे यकीन है कि के हो रही है कि इस SupportMapFragment पूरी तरह से ताजा है और हो सकता है ActionBarSherlock की देखभाल करने वाले अभी तक समय एबीएस परियोजना पर इसे जोड़ने के लिए नहीं था है।

इसके अलावा इसे एपीआई एलवीएल 8+ की आवश्यकता है ताकि आप एपीआई एलवीएल 7 डिवाइस पर अपना समर्थन हटा सकें या आपको जेक के लिए नए समर्थन मैपफ्रैगमेंट के लिए समर्थन जोड़ने की प्रतीक्षा करनी होगी।

अन्य एपीआई lvls के लिए आप यहां चारों ओर एक काम पा सकते हैं: http://xrigau.wordpress.com/2012/03/22/howto-actionbarsherlock-mapfragment-listfragment/

+0

पाउल, कृपया ऊपर मेरा संपादन देखें। आपके उत्तर के लिए धन्यवाद – StuStirling

4

मैं सुना कि जेक के रूप में गूगल अपने स्वयं के पिछड़े संगत ActionBar बाहर ला सकता है, बहुत ज्यादा अधिक ABS के लिए नहीं करने के लिए जा रहा है। मुझे लगता है कि अगर मुझे सही याद है तो एंड्रॉइड से संबंधित Google+ hangouts में से एक में चर्चा की गई थी।

नए नक्शे यदि आप एपीआई स्तर का समर्थन करना चाहिए तो भी ActionBar के बारे में चिंता करने से पहले आप समस्या में पड़ जाएगा आगे एपीआई स्तर 8 की आवश्यकता है 7.

मेरी सलाह स्तर 7 के लिए 2 लेआउट फ़ाइलें एक उत्पादन होगा और और 8+ के लिए एक। स्तर 7 में अब पुराने MapView का उपयोग करें, हालांकि वे इसे बहिष्कृत कर रहे हैं, जो मेरे लिए दिखाता है कि एपीआई स्तर 7 लक्ष्य के रूप में विचार करने के लिए आवश्यक नहीं है। 8+ लेआउट में नए मैप सिस्टम का उपयोग करें।

एक्शनबार के लिए, हम अभी एक ऐप पोर्ट कर रहे हैं और ViewPager पर आसानी से और सफलतापूर्वक नक्शा जोड़ा है, प्रोग्रामिंग (उदाहरण के लिए एक्सएमएल में) बनाकर। हमने इसे कई उपकरणों पर परीक्षण किया है।

हमें एबीएस के साथ Google डेमो में वर्णित नई मानचित्र प्रणाली का उपयोग करने में कोई समस्या नहीं है। हमने एक एक्सएमएल लेआउट में टुकड़ा घोषित किया और इसे गतिविधि की सामग्री के रूप में सेट किया। एक्शनबार सामान्य के रूप में प्रदर्शित करता है। गतिविधि एक शेरलॉक फ्रैगमेंट एक्टिविटी है।

+0

क्या आप कोड को एक खंड में प्रोग्राम के माध्यम से मानचित्र जोड़ने के तरीके पर साझा कर सकते हैं। मैं इसे शेरलॉक टैब –

+0

में जोड़ने की कोशिश कर रहा हूं क्या आपने इस SupportMapFragment को उप-वर्गीकृत किया है? मैं प्रोग्रामेटिक रूप से बना सकता हूं लेकिन अगर मैं उपclass नहीं कर सकता? – StuStirling

+0

और जब आप 'ViewPager' को स्वाइप कर रहे हैं, तो क्या आपके पास उन चमकदार काले कलाकृतियों नहीं हैं क्योंकि स्क्रीन पर' MapFragment' चलता है? –

3

मैंने ActionBarSherlock के साथ SupportMapFragment को लागू करने का प्रयास किया।

यह बहुत अच्छा काम कर रहा है।

enter image description here

नीचे कोड स्निपेट है।

package com.example.newmapview; 

import android.os.Bundle; 
import android.widget.Toast; 
import com.actionbarsherlock.app.SherlockFragmentActivity; 
import com.actionbarsherlock.view.Menu; 
import com.actionbarsherlock.view.MenuItem; 
import com.actionbarsherlock.view.SubMenu; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.SupportMapFragment; 

public class MainActivity extends SherlockFragmentActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     SupportMapFragment fragment = SupportMapFragment.newInstance(); 
     getSupportFragmentManager().beginTransaction() 
       .add(R.id.mapLayout, fragment).commit(); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 

     SubMenu subMenu = menu.addSubMenu("Type"); 

     subMenu.add("Normal"); 
     subMenu.add("SATELLITE"); 

     subMenu.getItem().setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); 

     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 

     if (item.getTitle().toString().equalsIgnoreCase("Normal")) { 
      Toast.makeText(this, "Clicked Normal", Toast.LENGTH_LONG).show(); 
      GoogleMap googleMap = ((SupportMapFragment) getSupportFragmentManager() 
        .findFragmentById(R.id.mapLayout)).getMap(); 

      if (googleMap != null) 
       googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); 
      else 
       Toast.makeText(this, "GoogleMap is null", Toast.LENGTH_LONG) 
         .show(); 
     } else if (item.getTitle().toString().equalsIgnoreCase("SATELLITE")) { 
      Toast.makeText(this, "Clicked SATELLITE", Toast.LENGTH_LONG).show(); 
      GoogleMap googleMap = ((SupportMapFragment) getSupportFragmentManager() 
        .findFragmentById(R.id.mapLayout)).getMap(); 

      if (googleMap != null) 
       googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE); 
      else 
       Toast.makeText(this, "GoogleMap is null", Toast.LENGTH_LONG) 
         .show(); 
     } 

     return true; 

    } 
} 

आशा इस में मदद मिलेगी।

+1

क्या आप कृपया एक्सएमएल भी साझा कर सकते हैं।मैं इसे एक टुकड़े के अंदर लागू करने की कोशिश कर रहा हूं –

+0

उत्तर के लिए धन्यवाद और मुझे खुशी है कि यह काम करता है क्योंकि यह मुझे निश्चित रूप से संभव दिखाता है। अब समस्या यह है कि मुझे इस SupportMapFragment का उप-वर्ग बनाने में सक्षम होना चाहिए, हालांकि मैं क्लास कास्ट अपवादों के सभी प्रकारों में चल रहा हूं। कोई उपाय? अपने XML लेआउट में – StuStirling

+0

, SupportMapFragment को MapFragment बदलने के लिए, यह इस तरह दिखना चाहिए: <टुकड़ा एंड्रॉयड: आईडी = "@ + id/नक्शा" एंड्रॉयड: layout_width = "match_parent" एंड्रॉयड: layout_height = "0dp" एंड्रॉयड: layout_weight = "1" वर्ग = "com.google.android.gms.maps.SupportMapFragment" /> – Gruzilkin

0

मैं हर जगह अभी तक कोई टिप्पणी नहीं कर सकते हैं, यही कारण है कि मैं @sureshcheemalamudi का जवाब आप कोशिश कर रहे हैं है इसे फ्रैगमेंट, या शेरलॉक फ्रैगमेंट पर लागू करने के लिए, इसे देखें: https://stackoverflow.com/a/17803561/1755300

0
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // toggle mapType 
    if (mapFragment != null) { 
     googleMap = mapFragment.getMap(); 
    } 
    switch (item.getItemId()) { 
    case R.id.action_normal: 
     googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); 
     Toast.makeText(getActivity(), "normal", Toast.LENGTH_LONG).show(); 
     return true; 
    case R.id.action_satellite: 
     googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE); 
     Toast.makeText(getActivity(), "satellite", Toast.LENGTH_LONG) 
       .show(); 
     return true; 
    case R.id.action_terrian: 
     googleMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN); 
     Toast.makeText(getActivity(), "terian", Toast.LENGTH_LONG).show(); 
     return true; 
    case R.id.action_hybrid: 
     googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); 
     Toast.makeText(getActivity(), "hybrid", Toast.LENGTH_LONG).show(); 
     return true; 
    default: 

     return super.onOptionsItemSelected(item); 
    } 
} 
+0

कोड का यह टुकड़ा प्रश्न का उत्तर कैसे है? कृपया विस्तार या हटाएं। – laalto

+0

बस नक्शाफ्रेम की जांच करें शून्य या न केवल एक बार और नक्शा जांचने की कोई आवश्यकता नहीं है, उपरोक्त कोड में दिखाए गए मानचित्र प्रकार को बदलने के दौरान हर बार शून्य है – Rahul