2012-12-06 27 views
53

में मैपफ्रैगमेंट ScrollView में मेरे पास MapFragment एस में से एक है। असल में यह SupportMapFragment है, लेकिन वैसे भी। यह काम करता है, लेकिन दो समस्याएं हैं:स्क्रॉलव्यू

  1. स्क्रॉल होने पर, यह एक काला मुखौटा पीछे छोड़ देता है। काले रंग बिल्कुल उस क्षेत्र को कवर करता है जहां नक्शा था, एक छेद को छोड़कर जहां +/- ज़ूम बटन थे। नीचे स्क्रीनशॉट देखें। यह एंड्रॉइड 4.0 पर है।

  2. दृश्य requestDisallowInterceptTouchEvent() का उपयोग नहीं करता है जब उपयोगकर्ता ScrollView में अवरोध उत्पन्न कर अंतिम रूप को रोकने के लिए नक्शे के साथ सूचना का आदान प्रदान, इसलिए यदि आप मानचित्र में खड़ी पैन करने के लिए प्रयास करते हैं, यह सिर्फ युक्त ScrollView स्क्रॉल करता है। मैं सैद्धांतिक रूप से व्यू क्लास MapView प्राप्त कर सकता हूं और उस कार्यक्षमता को जोड़ सकता हूं, लेकिन मानक के बजाय मेरे अनुकूलित MapView का उपयोग करने के लिए मुझे MapFragment कैसे मिल सकता है?

Partial screenshot of scrolling issue

+1

"मेरे पास स्क्रॉलव्यू में नए मैपफ्रैगमेंट्स में से एक है" - अगर यह अच्छी तरह से काम करता है तो मुझे आश्चर्य होगा। "मानक मैप के बजाय मेरे कस्टमाइज्ड मैप व्यू का उपयोग करने के लिए मैपफ्रैगमेंट कैसे प्राप्त कर सकता हूं?" - आप नहीं कर सकते, AFAIK। आपको अपने 'मानचित्र दृश्य' को होस्ट करने के लिए अपना खुद का टुकड़ा बनाना होगा। – CommonsWare

+0

मुझे भी एक ही समस्या का सामना करना पड़ रहा है, लेकिन मैं एक फ्रैगमेंट के भीतर कच्चे MapView का उपयोग कर रहा हूं। वही समस्या, जब स्क्रॉलव्यू या व्यूपेगर में स्क्रॉल करते हैं तो काला मुखौटा पीछे छोड़ दिया जाता है। –

+0

मेरे नेक्सस एस (एंड्रॉइड 4.1.2) पर, मुझे यह समस्या नहीं मिल रही है। हालांकि, मुझे परीक्षण किए गए सभी एंड्रॉइड 2.2-2.3 डिवाइसों पर बिल्कुल वही समस्या मिल रही है। – Ralf

उत्तर

52

MapView टुकड़ा पर एक पारदर्शी छवि को लागू करने से समस्या का समाधान करने लगता है। यह सबसे सुंदर नहीं है, लेकिन ऐसा लगता है कि यह काम करता है।

<RelativeLayout 
     android:id="@+id/relativeLayout1" 
     android:layout_width="match_parent" 
     android:layout_height="300dp" > 

     <fragment 
      android:id="@+id/map" 
      android:name="com.google.android.gms.maps.MapFragment" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent"/> 

     <ImageView 
      android:id="@+id/imageView123" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:src="@drawable/temp_transparent" />   
</RelativeLayout> 
+4

मैं पुष्टि कर सकता हूं कि यह काम करता है (हालांकि स्क्रीन के कुछ हिस्सों में अभी भी झिलमिलाहट है। मैंने एंड्रॉइड के साथ फ्रेमलायआउट का उपयोग करके एंड्रॉइड के साथ सादा '' का उपयोग किया: पृष्ठभूमि = "@ एंड्रॉइड: रंग/पारदर्शी" पारदर्शी के लिए देखें। – Ralf

+1

धन्यवाद दोस्त मैं बहुत से काम नहीं कर रहा हूं लेकिन आपका सरल और महान – appukrb

+2

महान नौकरी आदमी :) @ आप भी आधे! –

8

यह एक ही जगह में अपनी जड़ें पर this question में समस्या का कारण बनता है शायद है: यहाँ एक XML टुकड़ा है कि इस से पता चलता है। एक पारदर्शी फ्रेम का उपयोग करने के लिए समाधान है, जो एक पारदर्शी छवि से थोड़ा हल्का वजन है।

0

प्रश्न के दूसरे भाग के लिए - आप SupportMapFragment से एक खंड वर्ग प्राप्त कर सकते हैं, और इसके बजाय अपने लेआउट में इसका उपयोग कर सकते हैं। फिर आप Fragment#onCreateView ओवरराइड कर सकते हैं, और वहां अपने कस्टम मानचित्र दृश्य को तुरंत चालू कर सकते हैं।

यदि यह काम नहीं करता है, तो आप हमेशा अपना खुद का टुकड़ा बना सकते हैं - तो आपको बस अपने जीवनशैली विधियों को कॉल करने की देखभाल करने की आवश्यकता है (ऑनक्रेट, ऑनर्यूम इत्यादि)। This answer में कुछ और विवरण हैं।

32

मेरे लिए एक पारदर्शी छवि दृश्य जोड़ने से ब्लैक मास्क को पूरी तरह से हटाने में मदद नहीं मिली। स्क्रॉल करते समय मानचित्र के शीर्ष और निचले भाग अभी भी काले मुखौटा दिखाते हैं।

तो इसके लिए समाधान, मुझे this answer में एक छोटे से बदलाव के साथ मिला। मैं अपने नक्शा टुकड़ा को जोड़ा गया,

android:layout_marginTop="-100dp" 
android:layout_marginBottom="-100dp" 

के बाद से यह ऊर्ध्वाधर scrollview था।

<RelativeLayout 
    android:id="@+id/map_layout" 
    android:layout_width="match_parent" 
    android:layout_height="300dp"> 

    <fragment 
     android:id="@+id/mapview" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_marginTop="-100dp" 
     android:layout_marginBottom="-100dp" 
     android:name="com.google.android.gms.maps.MapFragment"/> 

    <ImageView 
     android:id="@+id/transparent_image" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:src="@color/transparent" /> 

</RelativeLayout> 

सवाल मैं अपने मुख्य scrollview के लिए requestDisallowInterceptTouchEvent(true) सेट के दूसरे भाग का समाधान करने के लिए: तो मेरी लेआउट अब इस तरह से देखा। जब उपयोगकर्ता ने पारदर्शी छवि को स्पर्श किया और स्थानांतरित किया तो मैंने MotionEvent.ACTION_DOWN और MotionEvent.ACTION_MOVE के लिए पारदर्शी छवि पर स्पर्श अक्षम कर दिया ताकि नक्शा खंड टच ईवेंट ले सके।

ScrollView mainScrollView = (ScrollView) findViewById(R.id.main_scrollview); 
ImageView transparentImageView = (ImageView) findViewById(R.id.transparent_image); 

transparentImageView.setOnTouchListener(new View.OnTouchListener() { 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     int action = event.getAction(); 
     switch (action) { 
      case MotionEvent.ACTION_DOWN: 
       // Disallow ScrollView to intercept touch events. 
       mainScrollView.requestDisallowInterceptTouchEvent(true); 
       // Disable touch on transparent view 
       return false; 

      case MotionEvent.ACTION_UP: 
       // Allow ScrollView to intercept touch events. 
       mainScrollView.requestDisallowInterceptTouchEvent(false); 
       return true; 

      case MotionEvent.ACTION_MOVE: 
       mainScrollView.requestDisallowInterceptTouchEvent(true); 
       return false; 

      default: 
       return true; 
     } 
    } 
}); 

यह मेरे लिए काम करता है। उम्मीद है कि यह आपकी मदद करता है ..

+0

क्या मार्कर पर टैप करने के साथ काम कर रहा है? –

+1

@ अब्दुल वहाब: हाँ। मैंने इसे इस तरह से स्थापित किया है और मैं मानचित्र में मार्कर पर क्लिक कर सकता हूं। – Simulant

+0

धन्यवाद प्रिय, इसके सहायक –

2

मैंने इस संरचना का उपयोग किया और मैंने समस्या को पार कर लिया।

मैप्स के टुकड़े के लिए एक कंटेनर दृश्य का उपयोग किया।

<ScrollView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

     <TextView 
      android:text="Another elements in scroll view1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" /> 


     <com.erolsoftware.views.MyMapFragmentContainer 
      android:orientation="vertical" 
      android:layout_width="match_parent" 
      android:layout_height="250dp"> 

      <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/eventMap" 
       tools:context="com.erolsoftware.eventapp.EventDetails" 
       android:name="com.google.android.gms.maps.SupportMapFragment"/> 

     </com.erolsoftware.views.MyMapFragmentContainer> 

     <TextView 
      android:text="Another elements in scroll view2" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" /> 



    </LinearLayout> 




</ScrollView> 

कंटेनर वर्ग:

public class MyMapFragmentContainer extends LinearLayout { 


    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) 
    { 
     if (ev.getActionMasked() == MotionEvent.ACTION_DOWN) 
     { 
      ViewParent p = getParent(); 
      if (p != null) 
       p.requestDisallowInterceptTouchEvent(true); 
     } 

     return false; 
    } 

    public MyMapFragmentContainer(Context context) { 
     super(context); 
    } 

    public MyMapFragmentContainer(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public MyMapFragmentContainer(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

} 
3

आर के बहुत सारे & डी के बाद डन:

fragment_one.xml चाहिए की तरह दिखता है:

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

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" > 

     <RelativeLayout 
      android:layout_width="match_parent" 
      android:layout_height="400dip" > 

      <com.google.android.gms.maps.MapView 
       android:id="@+id/mapView" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" /> 

      <View 
       android:id="@+id/customView" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:background="@android:color/transparent" /> 
     </RelativeLayout> 

     <!-- Your other elements are here --> 

    </LinearLayout> 

</ScrollView> 

आपका जावा वर्ग FragmentOne.j के

private GoogleMap mMap; 
private MapView mapView; 
private UiSettings mUiSettings; 
private View customView 

onCreateView

mapView = (MapView) rootView.findViewById(R.id.mapView); 
mapView.onCreate(savedInstanceState); 

if (mapView != null) { 
    mMap = mapView.getMap(); 
    mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); 
    mUiSettings = mMap.getUiSettings(); 
    mMap.setMyLocationEnabled(true); 
    mUiSettings.setCompassEnabled(true); 
    mUiSettings.setMyLocationButtonEnabled(false); 
} 


scrollViewParent = (ScrollView)rootView.findViewById(R.id.scrollViewParent); 
customView = (View)rootView.findViewById(R.id.customView); 

customView.setOnTouchListener(new View.OnTouchListener() { 

      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       int action = event.getAction(); 
       switch (action) { 
        case MotionEvent.ACTION_DOWN: 
         // Disallow ScrollView to intercept touch events. 
         scrollViewParent.requestDisallowInterceptTouchEvent(true); 
         // Disable touch on transparent view 
         return false; 

        case MotionEvent.ACTION_UP: 
         // Allow ScrollView to intercept touch events. 
         scrollViewParent.requestDisallowInterceptTouchEvent(false); 
         return true; 

        case MotionEvent.ACTION_MOVE: 
         scrollViewParent.requestDisallowInterceptTouchEvent(true); 
         return false; 

        default: 
         return true; 
       } 
      } 
     }); 
+0

मेरे पास नेस्टेड विजेट संरचना के अंदर बैठने की अतिरिक्त जटिलता थी। लेकिन मुझे अंत में आपके समाधान का उपयोग करके अपना रास्ता मिल गया। (मेरा स्क्रोल व्यू केवल view.getParent()) – Spidfire

+1

का उपयोग करके पहुंच योग्य था, आकर्षण की तरह काम करता है, मेरी मदद करता है जब शीर्ष मामले में सबसे अधिक वोट दिया गया जवाब मेरे मामले में विफल रहा .. धन्यवाद। –

0
<ScrollView 
      android:layout_width="match_parent" 
    :: 
    :: 
    :: 
     <FrameLayout 
      android:id="@+id/map_add_business_one_rl" 
      android:layout_width="match_parent" 
      android:layout_height="100dp" 
     > 
         <fragment 

          android:id="@+id/map" 
          android:name="com.google.android.gms.maps.SupportMapFragment" 
          android:layout_width="match_parent" 
          android:layout_height="match_parent" 
          android:layout_marginTop="-100dp" 
          android:layout_marginBottom="-100dp" 

          /> 

     </FrameLayout> 

    :: 
    :: 
    :: 
    </ScrollView> 
0

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

map:liteMode="true" 

अपनी लेआउट फ़ाइल में मानचित्र खंड के अंदर संपत्ति को ऊपर जोड़ें। और मुद्दा तय किया जाएगा।

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