2012-12-10 24 views
10

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

Screenshot of the issue

: निम्न स्क्रीनशॉट देखें (नोट:। सभी नक्शा इशारों उपयोगकर्ता स्क्रॉल करने के लिए अनुमति देने के लिए अक्षम हैं)

मेरे लेआउट एक्सएमएल:

<?xml version="1.0" encoding="utf-8"?> 
<ScrollView 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:scrollbars="vertical" 
android:fillViewport="true" > 

<RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:padding="20sp" > 

    <TextView 
     android:id="@+id/race_num" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="14sp" 
     android:textSize="@dimen/DetailsTop" 
     android:layout_alignParentLeft="true" 
     android:layout_toLeftOf="@+id/race_in_chase" /> 
    <TextView 
     android:id="@id/race_in_chase" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/in_the_chase" 
     android:textSize="@dimen/DetailsTop" 
     android:background="@drawable/inthechase" 
     android:paddingLeft="20sp" 
     android:paddingRight="20sp" 
     android:visibility="gone" 
     android:layout_alignParentRight="true" /> 

    <TextView 
     android:id="@+id/race_name" 
     style="@style/RaceDetailsName" 
     android:layout_below="@id/race_num" /> 
    <TextView 
     android:id="@+id/race_track" 
     style="@style/RaceDetailsText" 
     android:paddingBottom="20sp" 
     android:layout_below="@id/race_name" /> 

    <TextView 
     android:id="@+id/race_time" 
     style="@style/RaceDetailsText" 
     android:layout_below="@id/race_track" /> 
    <TextView 
     android:id="@+id/race_tv" 
     style="@style/RaceDetailsText" 
     android:layout_below="@id/race_time" /> 

    <fragment 
     android:id="@+id/map" 
     android:layout_width="match_parent" 
     android:layout_height="380dp" 
     android:layout_marginTop="20sp" 
     android:layout_marginBottom="20sp" 
     class="com.google.android.gms.maps.SupportMapFragment" 
     android:layout_below="@id/race_tv" /> 

    <TextView 
     android:id="@+id/race_track_size" 
     style="@style/RaceDetailsText" 
     android:layout_below="@id/map" /> 

</RelativeLayout> 

</ScrollView> 

मेरे मानचित्र सेटअप में मेरी गतिविधि:

private void setUpMapIfNeeded() { 
    if (mMap == null) { 
     mMap = ((SupportMapFragment) getSupportFragmentManager() 
       .findFragmentById(R.id.map)).getMap(); 
     if (mMap != null) { 
      setUpMap(); 
     } 
    } 
} 

private static final LatLng CHICAGOLAND = new LatLng(41.474856, -88.056928); 

private void setUpMap() { 
    mMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE); 
    mMap.getUiSettings().setZoomControlsEnabled(false); 
    mMap.getUiSettings().setAllGesturesEnabled(false); 
    CameraPosition cameraPosition = new CameraPosition.Builder() 
     .target(CHICAGOLAND) 
     .zoom(14.5f) 
     .bearing(53) 
     .build(); 
    mMap.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); 
} 

मेरा हंच नक्शा खंड है n अगर लेआउट स्क्रीन पर फिट बैठता है और स्क्रॉलिंग की आवश्यकता नहीं है तो लेआउट के बाद स्क्रॉलव्यू की तरह ठीक है। नक्शा स्वयं सही आकार प्रतीत होता है। ब्लैकआउट दृश्य में शेष वस्तुओं का सटीक आकार है। क्या किसी के पास कोई विचार है कि मैं मानचित्र के नीचे ब्लैकआउट से कैसे छुटकारा पा सकता हूं ताकि मैं नीचे टेक्स्टव्यू देख सकूं? अब तक जो कुछ भी मैंने कोशिश की है वह काम नहीं कर पाया है।

उत्तर

3

मैं एक हैक के साथ इस मुद्दे के आसपास काम करने में सक्षम था। मैंने स्क्रॉलव्यू बढ़ाया ताकि मैं स्क्रॉल घटनाओं पर अधिसूचित हो सकूं। मैंने Synchronise ScrollView scroll positions - android से ObservableScrollView कार्यान्वयन का उपयोग किया।

ObservableScrollView sv = (ObservableScrollView) findViewById(R.id.scroll); 
sv.setScrollViewListener(this); 

तब, जब मैं एक स्क्रॉल बदल घटना प्राप्त करते हैं, मैं पूरी देखने के लिए, जो एक फिर से लेआउट, जो ब्लैक बॉक्स से बचाता है बलों की दृश्यता टॉगल:

मैं अपने OnCreate() को जोड़ा गया प्रकट होने से

public void onScrollChanged(ObservableScrollView sv, int x, int y, int oldx, int oldy) { 
    sv.setVisibility(View.GONE); 
    sv.setVisibility(View.VISIBLE); 
} 

मैंने मानचित्र दृश्य को अमान्य करने की कोशिश की, और मानचित्र दृश्य की दृश्यता को टॉगल करने की कोशिश की, लेकिन न तो काम किया। शुक्र है कि पूरे दृश्य की दृश्यता को टॉगल करने से कोई फ्लिकर या अन्य अजीब व्यवहार नहीं होता है।

शायद एक बेहतर समाधान है, लेकिन इस बिंदु पर, यह एकमात्र चीज है जिसे मैंने पाया है जो काम करता है।

+0

वास्तव में कोई झिलमिलाहट नहीं? मैंने SlidngMenu के साथ इस समाधान की कोशिश की, लेकिन यह कुछ भी नहीं बदला। विवरण के लिए इसे देखें: http://stackoverflow.com/questions/14419521/moving-mapfragment-surfaceview-causes-black-background-flickering/14571989#comment20335526_14571989 –

+0

मेरे पास नक्शा के नीचे संपादन टेक्स्ट हैं और मैंने इसका उपयोग किया, संपादन टेक्स्ट अगले खो देता है फोकस, मैं यह कैसे कर सकता हूं, या कोई और तरीका है? – JRowan

0

मेरा अनुमान है कि गतिविधि की शुरुआत के दौरान MapFragment की ऊंचाई 0 है।

<RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:padding="20sp" > 

.... 

     <TextView 
      android:id="@+id/race_track_size" 
      style="@style/RaceDetailsText" 
      android:layout_alignParentBottom="true" 
      android:layout_marginBottom="2dp"/> 

</RelativeLayout> 
+0

आपके सुझाव के लिए धन्यवाद। दुर्भाग्य से, यह काम नहीं किया। मेरे पास अभी भी ब्लैक बार है, और लिंट इस चेतावनी को फेंक रहा है: यह सापेक्ष लयआउट एंड्रॉइड का उपयोग करना चाहिए: layout_height = "wrap_content"। कोई अन्य विचार? – meisteg

+0

बस एक प्रयोग के रूप में - क्या आपने टेक्स्टव्यू को नक्शा खंड के ऊपर प्रश्न में डालने का प्रयास किया है? क्या होता है जब आप ऐसा करते हैं? – DiscDev

+0

मैंने टेक्स्ट व्यू को स्थानांतरित करने का प्रयास किया है। ब्लैक बार अभी भी नक्शे के नीचे दिखाई देता है, लेकिन यह छोटा है क्योंकि कम लेआउट (केवल लेआउट पैडिंग/मार्जिन) है। – meisteg

0

बस एक प्रयोग के साथ प्रयास करें, लेकिन आप setupMap() में प्रोग्राम के रूप में स्क्रीन पर TextView जोड़ने की कोशिश की है के बाद मानचित्र पहले से ही शुरू कर दिया गया?

// First, get a handle on the parent RelativeLayout, 
// call it parentRelativeLayout, then…     

TextView textView = new TextView(getActivity()); 
RelativeLayout.LayoutParams textLayout = new RelativeLayout.LayoutParams(
    RelativeLayout.MATCH_PARENT, 
    RelativeLayout.MATCH_PARENT 
); 
textLayout.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, -1); 
textView.setLayoutParams(textLayout); 

parentRelativeLayout.addView(textView) 
1

मैं FragmentPagerAdapter में onPageScrolled अधिभावी द्वारा एक Viewpager में एक ही मुद्दे के लिए ऊपर अनुकूलित करने में सक्षम था:

@Override 
public void onPageScrolled(int position, float positionOffset, 
          int positionOffsetPixels) { 
    if ((position == 0 && positionOffsetPixels > 0) || 
     (position == 1 && positionOffsetPixels == 0)) { 
     MyFragment blackedOutFragment = (MyFragment) getSupportFragmentManager() 
       .findFragmentByTag("android:switcher:" + R.id.pager + ":1"); 
     if (blackedOutFragment != null) { 
      blackedOutFragment.getView().setVisibility(View.GONE); 
      blackedOutFragment.getView().setVisibility(View.VISIBLE); 
     } 
    } 
} 

कहाँ Viewpager में स्थिति 0 एक टुकड़ा एक MapFragment और स्थिति 1 पकड़े टुकड़ा है स्क्रॉल के बाद बाहर निकलना।

0

एक और संभावना नई GoogleMap.snapshot() फ़ंक्शन का उपयोग करने के लिए है बनाने और मानचित्र का एक स्क्रीनशॉट उपयोग करने के बजाय के रूप में here वर्णित करके इसे ठीक करना चाहिए।

1

मेरा कामकाज: नए snapshot interface from GoogleMap का उपयोग करें और पृष्ठ को स्क्रॉल करते समय मानचित्र का स्नैपशॉट प्रदर्शित करें।

यहाँ स्नैपशॉट (यह FragmentMap.java कहा जाता है, नक्शे के रूप में एक ही टुकड़ा में है) की स्थापना करने के लिए अपने कोड है:

public void setSnapshot(int visibility) { 
    switch(visibility) { 
    case View.GONE: 
     if(mapFragment.getView().getVisibility() == View.VISIBLE) { 
      getMap().snapshot(new SnapshotReadyCallback() { 
       @Override 
       public void onSnapshotReady(Bitmap arg0) { 
        iv.setImageBitmap(arg0); 
       } 
      }); 
      iv.setVisibility(View.VISIBLE); 
      mapFragment.getView().setVisibility(View.GONE); 
     } 
     break; 
    case View.VISIBLE: 
     if(mapFragment.getView().getVisibility() == View.GONE) { 
      mapFragment.getView().setVisibility(View.VISIBLE); 
      iv.setVisibility(View.GONE); 
     } 
     break; 
    } 
} 

कहाँ "mapFragment" मेरे SupportedMapFragment और "iv" है एक imageView है (बनाना यह match_parent)।

और यहाँ मैं पुस्तक को नियंत्रित कर रहा हूँ:

pager.setOnPageChangeListener(new OnPageChangeListener() { 
     @Override 
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 
      if(position == 0 && positionOffsetPixels > 0 || position == 1 && positionOffsetPixels > 0) { 
       ((FragmentMap)adapter.getRegisteredFragment(1)).setSnapshot(View.GONE); 
      } else if(position == 1 && positionOffsetPixels == 0) { 
       ((FragmentMap)adapter.getRegisteredFragment(1)).setSnapshot(View.VISIBLE); 
      } 
     } 
     @Override 
     public void onPageScrollStateChanged(int arg0) {} 
     @Override 
     public void onPageSelected(int arg0) {} 
    }); 

नक्शा (FragmentMap) के साथ मेरे टुकड़ा स्थिति 1 पर है, इसलिए मैं 1 के लिए और स्थिति 1 से 2 करने के लिए (स्थिति 0 से स्क्रॉल नियंत्रित करने के लिए की जरूरत है पहला अगर क्लॉज)। "getRegisteredFragment()" मेरे कस्टम FragmentPagerAdapter में एक फ़ंक्शन है, जिसमें मेरे पास "पंजीकृत फ़्रेगमेंट" नामक स्पैर्सएरे (फ्रैगमेंट) है।

तो, जब भी आप अपने मानचित्र पर या उससे स्क्रॉल करते हैं, तो आप हमेशा इसका स्नैपशॉट देखते हैं। यह मेरे लिए बहुत अच्छा काम करता है।

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