Google मैप्स एपीआई v2 के साथ ViewPager: रहस्यमय काले दृश्य


95

मैंने एक दृश्य पेजर में नए गूगल मैप्स एपी वी 2 टुकड़े को एकीकृत किया है। नक्शे के टुकड़े से स्क्रॉल करते समय, एक काला दृश्य आसन्न टुकड़ों को ओवरलैप करता है। किसी ने हल किया है?

संपादित करें: स्क्रीनशॉट

यहां छवि विवरण दर्ज करें

public static class PagerAdapter extends FragmentPagerAdapter{

    public PagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public int getCount() {
        return NUM_ITEMS;
    }

    @Override
    public Fragment getItem(int position) {

        Fragment pageFragment;

        switch (position) {
        case 0:
            pageFragment = new TabAFragment();
            break;

        case 1:
            pageFragment = new TabBFragment();
            break;

        case 2:
            pageFragment = SupportMapFragment.newInstance();
            break;

        default:
            pageFragment = null;
            break;
        }

        return pageFragment;
    }
}

क्या यह एक से अधिक उपकरण होता है? शायद आपको ViewPager और मानचित्र कार्यान्वयन से कुछ कोड लाइनें आपकी समस्या को बेहतर ढंग से समझने में मदद कर सकती हैं।
एडिनिया

हां, मेरे द्वारा आजमाए गए सभी उपकरणों पर होता है: सैमसंग, एचटीसी, एंड्रॉइड 4.0, 2.3, आदि। मैंने अपने ऐप में मैप को एकीकृत किया है, और केवल एक ही परिणाम के साथ पेजर और मैप के साथ एक साफ छोटे ऐप में।
पेपे

@ पेपे, क्या आप यह कहेंगे कि आपको GoogleMapवस्तु कैसे मिलती है ViewPager? हफ्तों तक इस पर अटका रहा। यदि आपको अच्छी तरह से प्रश्न समझ में नहीं आया है, तो मेरे प्रश्न को देखें, आपको मेरी पोस्ट मिल जाएगी। कृपया उत्तर दें।
एज़िज़बेकियन

मैं जोड़ना चाहता हूं कि जब कोई screen recordसमस्या होती है तो ऐसा नहीं होता है।
दिबांग

जवाबों:


115

मैं ViewPagerअंदर के शीर्ष पर एक पारदर्शी पृष्ठभूमि के साथ एक और दृश्य रखकर संक्रमण के बाद छोड़ी जा रही काली सतह को रोकने में सक्षम था FrameLayout:

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

    <android.support.v4.view.ViewPager
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </android.support.v4.view.ViewPager>

    <!-- hack to fix ugly black artefact with maps v2 -->
    <FrameLayout 
        android:layout_width="match_parent"
        android:layout_height="match_parent" 
        android:background="@android:color/transparent" />

</FrameLayout>

1
महान! यह सही नहीं है, क्योंकि कभी-कभी चलते हुए पेजर काले दृश्य का हिस्सा प्रतीत होता है। लेकिन अब यह किसी भी अधिक स्क्रीन में नहीं रहता है। धन्यवाद! (क्या आपके पास इस हैक के लिए कोई स्पष्टीकरण है?)
पेपे

7
ज़रुरी नहीं। मैंने अभी देखा कि ज़ूम और लोकेशन नियंत्रण मानचित्र के शीर्ष पर बैठे थे, जो काला निशान दिखाई नहीं दिया था, इसलिए मैंने पूरे मानचित्र को कवर करने के लिए शीर्ष पर एक दृश्य रखा और यह काम कर गया। मैं इसे सही नहीं है सहमत हूँ - काले रंग की पृष्ठभूमि GLSurfaceView खिड़की का हिस्सा प्रतीत हो रहा है code.google.com/p/gmaps-api-issues/issues/detail?id=4639
जेफ Gilfelt

5
ऐसा लगता है कि यह मेरा ViewPager मुद्दा तय किया है। धन्यवाद, लेकिन ऐसा लगता है कि मेरे पास एक समान मुद्दा w / एक SlideMenu है (G + / Yahoo जैसे बाएं मेनू), एक ही काम कर रहा है .. एक SlideMenu कार्यान्वयन को ठीक करने पर कोई विचार?
क्रिसपिक्स

@ क्रिस ने कंटेनर को चेतन नहीं किया, केवल साइड मेनू पर एनीमेशन का उपयोग करें, यह मेरे लिए तय किया।
हुंह

1
Ive ने यह और नीचे दिया गया प्रोग्रामेटिक सॉल्यूशन, वे काम करते हैं, जबकि ऐप अग्रभूमि में है, लेकिन जब ऐप बंद हो जाता है और फिर भी चल रहा होता है और आप इसे वापस ले जाते हैं, तो मैप टॉप पर रहता है ..
L7ColWinters

43

SlidingMenu और ViewPager के साथ भी यही समस्या थी। मैंने देखा कि नक्काशी के पीछे नक्शे के टुकड़े में नियंत्रण बटन काले नहीं हैं। मैंने की onCreateView()विधि को ओवरराइड करके समस्या का समाधान कियाMapFragment (SupportMapFragment)

@Override
public View onCreateView(LayoutInflater inflater, 
                         ViewGroup view, 
                         Bundle savedInstance) {

    View layout = super.onCreateView(inflater, view, savedInstance);
    FrameLayout frameLayout = new FrameLayout(getActivity());
    frameLayout.setBackgroundColor(
        getResources().getColor(android.R.color.transparent));
    ((ViewGroup) layout).addView(frameLayout,
        new ViewGroup.LayoutParams(
            LayoutParams.FILL_PARENT, 
            LayoutParams.FILL_PARENT
        )
    );
    return layout;
}

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

मेरे लिए कोई भी फिक्स काम नहीं हुआ। मेरे पास व्यावहारिक रूप से एक ही मुद्दा है Michal K. SlidingMenu का उपयोग करना और निरंतर गति से धीरे-धीरे खोलना या बंद करना और कोई समस्या नहीं है। खिड़की को बंद करने के लिए खुला खुला या वापस दबाएं और ऐसा लगता है कि जब तक नक्शा अपनी उचित स्थिति में वापस नहीं आ जाता, तब तक नक्शा खाली जगह को छोड़ने के लिए मानचित्र थोड़ा सा ढीला हो जाता है।
qubz

@qubz: 'स्लाइडिंग मेनू' के बारे में मेनू को एनिमेट करने की कोशिश करें, न कि मैप को। यह मेरे लिए समस्या का हल है, अगर नक्शा नहीं चल रहा है।
मीह

@meh: जब मैं स्लाइडिंगमेनू खोल रहा / बंद कर रहा हूं तो नक्शा आगे बढ़ सकता है। हिलाने से मेरा मतलब है CameraUpdate। मैं देखूंगा कि क्या मैं एनीमेशन को रोक सकता हूं, हालांकि यह UX में बाधा डालने वाला है।
qubz

@Lubos Horacek: क्या आप कृपया एक नमूना कोड पोस्ट कर सकते हैं। मुझे अशक्त सूचक अपवाद त्रुटि मिल रही है ..
अविनाश

7

Google ने इसके लिए एक निर्धारण जारी किया, लेकिन केवल 4.1+ के लिए (आपको PlayServices का नया संस्करण डाउनलोड करने की आवश्यकता नहीं है, उन्होंने सर्वर साइड फ्लैग का उपयोग किया है)

यहाँ मैं इस मुद्दे को बायपास करने के लिए उपयोग कर रहा हूं - यह सुनिश्चित करता है कि आप उपकरणों> = 4.1 पर किसी भी सीपीयू साइकिल को बर्बाद न करें

public class FixMapFragment extends SupportMapFragment {

    @Override
    public View onCreateView(LayoutInflater inflater, 
                             ViewGroup container, 
                             Bundle savedInstanceState) {

        View view = super.onCreateView(inflater, container, savedInstanceState);

        // Fix for black background on devices < 4.1
        if (android.os.Build.VERSION.SDK_INT < 
            android.os.Build.VERSION_CODES.JELLY_BEAN) {
            setMapTransparent((ViewGroup) view);
        }
        return view;
    }

    private void setMapTransparent(ViewGroup group) {
        int childCount = group.getChildCount();
        for (int i = 0; i < childCount; i++) {
            View child = group.getChildAt(i);
            if (child instanceof ViewGroup) {
                setMapTransparent((ViewGroup) child);
            } else if (child instanceof SurfaceView) {
                child.setBackgroundColor(0x00000000);
            }
        }
    }
}

मुझे लगता है कि आप निम्न वर्ग का संदर्भ देते हैं: FixMapFragment mapFragment = (FixMapFragment) fragmentManager.findFragmentById(R.id.map);और लेआउट फ़ाइल में <fragment android:id="@+id/map" android:name="com.example.fragments.FixMapFragment" ...:। हालाँकि, मैप अभी भी फ़्लिकर करता है जहाँ तक मैं बता सकता हूँ (Android 4.0.4)।
JJD

@JJD मैं एक नक्शा है कि फ़्लिकर है, क्या इसका हल करने का कोई तरीका है?
चूहा-ए-तात-ए-तात रतातौली

@ चूहा-ए-तात-ए-तातरातौली जहाँ तक मुझे पता है, नक्शे के दृश्य की टिमटिमा से बचने के लिए कोई विश्वसनीय हल नहीं है।
JJD

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

6

मेरा वर्कअराउंड: 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 पर है, इसलिए मुझे स्क्रॉल को स्थिति 0 से 1 तक और स्थिति 1 से 2 (पहले अगर-खंड) की आवश्यकता है। "getRegisteredFragment ()" मेरे कस्टम FragmentPagerAdapter में एक फ़ंक्शन है, जिसमें मेरे पास एक SparseArray (फ़्रैगमेंट) है जिसे "पंजीकृतफ़्रेग्मेंट्स" कहा जाता है।

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


अन्य जवाब मेरे काम नहीं आए - यह एकमात्र ऐसा काम है। धन्यवाद!
alice_silver_man

4

मेरे पास सूची दृश्य की स्क्रॉलिंग पर काली स्क्रीन का एक ही मुद्दा था, मैं उसी स्क्रीन में सूची दृश्य के साथ मानचित्र के टुकड़े का उपयोग कर रहा था मैंने इस समस्या को xml में जादुई संपत्ति के उपयोग के साथ हल किया है जहां मैं सूची दृश्य देख रहा हूं बस हमें एंड्रॉइड डालना होगा : ScrollCache = "false" .my समस्या ठीक हो गई है इस गुण को अपने मानचित्रों में अंतराल और फ़्लिकरिंग को रोकने के लिए आज़माएं।


2

आपने बहुत विस्तार नहीं दिया है इसलिए केवल इतना ही मैं सुझाव दे सकता हूं। मेरे पास एक समान मुद्दा था कि स्क्रीन पेजर में विचारों के बीच टिमटिमाती थी। यह पहली बार पृष्ठों के बीच स्वैप करते समय मैपव्यू को फुलाते हुए निकला।

स्पष्ट करने के लिए मेरे पेजर में 3 पृष्ठ थे और मेरा नक्शा अंतिम पृष्ठ था।

इसे हल करने के लिए मैंने पाया कि ऑफ स्क्रीन पेजों की संख्या को 2 पर सेट करना (यह ऊपर के मामले में काम किया है) कि जब मेरे टुकड़े ने शुरू किया तो यह एक ही बार में सभी विचारों को लोड करता है।

Http://developer.android.com/reference/android/support/v4/view/ViewPager.html#setOffscreenPageLimit (int) देखें


धन्यवाद, लेकिन काम नहीं किया। समस्या यह है कि नक्शे के द्वारा कवर की गई स्क्रीन का हिस्सा, जब अन्य टुकड़े में परिवर्तित होता है, तो काला रहता है, इस अन्य टुकड़े के दृश्य को कवर करता है।
पेपे

हम्म् दिलचस्प। मुझे इस पर सोचना होगा।
ग्राहम स्मिथ

मुझे पता नहीं है सेटऑफ़स्क्रीनपेज पेज को उस पेज पर लिंक करें
mplungjan

0

इस समस्या का एक और समाधान है। मैं एक और टुकड़े के भीतर MapFragment दिखा रहा हूं। MapFragment गतिशील रूप से एक FrameLayout में जोड़ा जाता है।

समाधान के लिए फ्रेमलैटआउटसेटसेट (व्यू.विजिबल) और फ्रेमलैटआउट का उपयोग किया जाता है। मेन्यू और स्लाइडिंग मेनू के ओपन और क्लोज इवेंट्स पर व्यूबिलिटी (व्यू.गोन) का उपयोग करें। इसे जोड़ने के लिए एक अतिरिक्त दृश्य की आवश्यकता होती है। और ब्लैक एरिया पूरी तरह से चला गया है।

getSlidingMenu().setOnOpenListener(
        new OnOpenListener() {
            @Override
            public void onOpen() {
                frameLayout.setVisibility(View.GONE);
            }
        });

getSlidingMenu().setOnClosedListener(
        new OnClosedListener() {

            @Override
            public void onClosed() {
                frameLayout.setVisibility(View.VISIBLE);
            }
        });

0

ऊपर दिए गए तरीकों में से कोई भी मेरे लिए काम नहीं करता है, यहां तक ​​कि दूसरों ने भी नहीं जो मैंने कहीं और पाया है। अंत में, मैंने एक आंशिक समाधान चुना। मैं ViewPager के onPageChangeListener के माध्यम से पृष्ठ परिवर्तनों को सुनता हूं, और जब इसका पृष्ठ स्क्रॉल करना शुरू करता है, तो नक्शा छिपाता है, और इसी तरह इसे फिर से दिखाता है जब यह स्क्रॉल करना बंद कर देता है। मैंने स्क्रॉल करते समय प्रदर्शित होने के लिए एक सफेद दृश्य भी जोड़ा है।


यह दृश्य की वर्तमान छवि को बिटमैप पर कैप्चर करने के लिए आगे बढ़ाया जा सकता है, और फिर पेजर स्क्रॉल करते समय इसे एक ImageView पर प्रदर्शित करता है। इस तरह, उपयोगकर्ता इसके पीछे हैक को नोटिस नहीं करेंगे। हालाँकि, मुझे यह गणना थोड़ी महंगी लगी क्योंकि यह स्वाइप करने के लिए यूआई की प्रतिक्रिया को धीमा कर देती है।
29'13 को दोपहर

-2

बस अपनी परियोजना के लिए मेरे कस्टम मानचित्र टुकड़े की प्रतिलिपि बनाएँ । और अगर आपके ऊपर स्क्रॉल करने के लिए काली लाइनें हैं, तो अपने स्क्रॉल दृश्य Android पर ऊपर और नीचे सेट करें: fadingEdge = "कोई नहीं"

public class CustomMapFragment extends SupportMapFragment {
private OnActivityCreatedListener onActivityCreatedListener;

public CustomMapFragment() {
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup view, Bundle savedInstance) {
    View layout = super.onCreateView(inflater, view, savedInstance);

    FrameLayout frameLayout = new FrameLayout(getActivity());
    frameLayout.setBackgroundColor(getResources().getColor(android.R.color.transparent));
    ((ViewGroup) layout).addView(frameLayout,
            new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
    return layout;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    if (getOnActivityCreatedListener() != null)
        getOnActivityCreatedListener().onCreated();
}

public OnActivityCreatedListener getOnActivityCreatedListener() {
    return onActivityCreatedListener;
}

public void setOnActivityCreatedListener(
        OnActivityCreatedListener onActivityCreatedListener) {
    this.onActivityCreatedListener = onActivityCreatedListener;
}

public interface OnActivityCreatedListener {
    void onCreated();
}

}

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.