গুগল ম্যাপস এপিআই ভি 2 সহ ভিউপেজার: রহস্যজনক কালো দর্শন


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;
    }
}

এটি কি একাধিক ডিভাইস ঘটবে? আপনার ভিউপ্যাজার এবং মানচিত্রের প্রয়োগের কয়েকটি কোড লাইন আপনার সমস্যাটিকে আরও ভালভাবে বুঝতে সহায়তা করতে পারে।
আদিনিয়া

হ্যাঁ, আমি চেষ্টা করেছি এমন সমস্ত ডিভাইসে ঘটে: স্যামসং, এইচটিসি, অ্যান্ড্রয়েড 4.0.০, ২.৩ ইত্যাদি। আমি আমার অ্যাপটিতে মানচিত্রকে একীভূত করেছি এবং একই ফলাফল সহ কেবল পেজার এবং মানচিত্রের সাথে একটি পরিষ্কার ছোট অ্যাপ্লিকেশনটিতে করেছি।
পেপে

@ পেপ, আপনি কি দয়া করে বলবেন, কীভাবে আপনি এই বিষয়টির GoogleMapকাছ থেকে আপত্তি পান ViewPager? কয়েক সপ্তাহ ধরে এই আটকে যদি আপনি ভাল করে প্রশ্ন না বুঝতে পারেন, তবে আমার প্রশ্নটি দেখুন, আপনি আমার পোস্টটি খুঁজে পাবেন। অনুগ্রহপূর্বক জবাব দিবেন.
আজিজবিকিয়ান

আমি এটি যুক্ত করতে চাই যখন screen recordকোনও সমস্যাটি করা হচ্ছে তখন মনে হচ্ছে না।
theblang

উত্তর:


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>

4
দুর্দান্ত! এটি নিখুঁত নয়, কারণ কখনও কখনও পেজার চলার সময় কালো দর্শনের অংশ হিসাবে উপস্থিত হয়। তবে এখন আর পর্দায় থাকে না। ধন্যবাদ! (এই হ্যাকটির জন্য আপনার কোনও ব্যাখ্যা আছে?)
পেপ

7
আসলে তা না. আমি কেবল লক্ষ্য করেছি যে যেখানে জুম এবং অবস্থান নিয়ন্ত্রণগুলি মানচিত্রের পৃষ্ঠের উপরে বসে কালো রঙের ট্রেইলটি উপস্থিত হয়নি, তাই আমি পুরো মানচিত্রটি coverাকতে উপরে একটি দৃশ্য রেখেছি এবং এটি কার্যকর হয়েছে। আমি সম্মতি জানাই
জেফ গিলফেল্ট

5
দেখে মনে হচ্ছে এটি আমার ভিউপাগার সমস্যাটি স্থির করেছে। ধন্যবাদ, তবে দেখে মনে হচ্ছে আমার কাছে ডাব্লু / একটি স্লাইডমেনু (জি + / ইয়াহুর মতো বাম মেনু) একই কাজ করছে .. স্লাইডমেনু বাস্তবায়ন ঠিক করার বিষয়ে কোনও চিন্তা?
ক্রিসপিক্স

@ ক্রিসপিক্স কনটেইনারটি অ্যানিমেট করবেন না, অ্যানিমেশনটি কেবল পাশের মেনুতে ব্যবহার করুন, এটি এটি আমার জন্য স্থির করে।
meh

4
আমি এটি এবং নীচের প্রোগ্রামেটিক সমাধানটি করেছি, অ্যাপটি অগ্রভাগে থাকা অবস্থায় তারা কাজ করে তবে যখন অ্যাপটি বন্ধ থাকে এবং এখনও চলমান থাকে এবং আপনি এটিতে ফিরে যান মানচিত্রটি এখনও শীর্ষে থাকে ..
L7ColWinters

43

স্লাইডিংমেনু এবং ভিউপ্যাজারে একই সমস্যা ছিল। আমি লক্ষ্য করেছি যে মানচিত্রের খণ্ডে কন্ট্রোল বোতামগুলি আর্টফ্যাক্টের পিছনে বামে কালো নয়। আমি 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;
}

আমি স্লাইডিংমেনুর জন্যও এটি ব্যবহার করি। তবে আমার কাছে ঝাঁকুনির বিষয়টি আছে (স্লাইডিং অ্যানিমেশন সহ) এবং এটি অগ্রহণযোগ্য, দেখতে ভয়ঙ্কর দেখাচ্ছে। তোমারও কি আছে? আমি এইচটিসি ওয়ান এস-তে পরীক্ষা করেছি কী আকর্ষণীয়, স্লাইডিংমেনু বন্ধ করার সময় আমার কেবল এই প্রারম্ভিক অ্যানিমেশনটি নেই
কে

কোনও ফিক্স আমার পক্ষে কাজ করেনি। আমার কাছে কার্যত একই সমস্যা হ'ল মিশাল কে Sl স্লাইডিংমেনু ব্যবহার করে এবং অবিচ্ছিন্ন গতিতে ধীরে ধীরে খোলার বা বন্ধ হওয়া এবং কোনও সমস্যা নেই। উইন্ডোটি বন্ধ করতে খোলা বা পিছনে টিপুন এবং স্লাইডটি যেখানে সঠিক অবস্থানে ফিরে আসে সেখানে স্লাইডটি শেষ না হওয়া অবধি মানচিত্রটি ফাঁকা জায়গা রেখে কিছুটা পিছিয়ে পড়েছে বলে মনে হচ্ছে।
qubz

@ কেবিজেড: 'স্লাইডিং মেনু' সম্পর্কে মেনুটি অ্যানিমেট করার চেষ্টা করুন, মানচিত্রটি নয়। এটি আমার জন্য সমস্যাটি সমাধান করেছে, যদি মানচিত্রটি না সরানো থাকে।
meh

@ মীহ: স্লাইডিংমেনু খুলতে / বন্ধ করার সময় মানচিত্রটি চলতে পারে। সরে যাওয়ার অর্থ ক্যামেরাআপডেট। আমি অ্যানিমেশনটি থামাতে পারি কিনা তা আমি দেখতে পাচ্ছি, যদিও এটি ইউএক্সকে বাধা দিচ্ছে।
qubz

@ লুবস হোরেসেক: আপনি দয়া করে একটি নমুনা কোড পোস্ট করতে পারেন I আমি নুল পয়েন্টার ব্যতিক্রমী ত্রুটি
পাচ্ছি

7

গুগল এটির জন্য একটি সমাধান প্রকাশ করেছে, তবে কেবল 4.1+ এর জন্য (আপনার প্লে সার্ভিসেসের নতুন সংস্করণ ডাউনলোড করার দরকার নেই, তারা একটি সার্ভার সাইড ফ্ল্যাগ ব্যবহার করেছেন)

সমস্যাটি বাইপাস করার জন্য আমি এখানে যা ব্যবহার করছি তা নিশ্চিত করে - আপনি ডিভাইসে কোনও সিপিইউ চক্র নষ্ট করবেন না> = 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" ...। যদিও, মানচিত্রটি এখনও যতদূর আমি বলতে পারি সেভাবে ঝাঁকুনি (অ্যান্ড্রয়েড 4.0.০.৪)।
জেজেডি

@ জেজেডি আমার কাছে একটি ম্যাপভিউ রয়েছে যা ফ্লিকাররা, এটি সমাধান করার কোনও উপায় আছে?
র‌্যাট-এ-ট্যাট-এ-ট্যাট রাতাতুইলে

@ রেট-এ-ট্যাট-এ-ট্যাটরাটৌইল যতদূর আমি জানি মানচিত্রের দৃশ্যের ঝলকানি এড়াতে কোনও নির্ভরযোগ্য কাজ নেই।
জেজেডি

আমি জানিনা যে আমি আপাতত যা করেছি তা সঠিক কিনা না তবে তা কার্যকর হয়। আমি মানচিত্রের দৃশ্যমানতা অদৃশ্যতে সেট করেছিলাম এবং এরপরে কয়েক সেকেন্ড পরে মানচিত্রের দৃশ্যমানতা আবার দৃশ্যমানতে সেট করি। ঝাঁকুনি হ্রাস করে।
র‌্যাট-এ-ট্যাট-এ-ট্যাট রাতাতুইলে

6

আমার কার্যত: গুগল্যাপ থেকে নতুন স্ন্যাপশট ইন্টারফেসটি ব্যবহার করুন এবং পৃষ্ঠাটি স্ক্রোল করার সময় মানচিত্রের একটি স্ন্যাপশট প্রদর্শন করুন।

স্ন্যাপশটটি সেট করার জন্য আমার কোডটি এখানে রয়েছে (এটি মানচিত্রের মতো একই খণ্ডে, ফ্রেগমেন্টম্যাপ.জভা নামে পরিচিত):

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;
    }
}

যেখানে "ম্যাপফ্রেগমেন্ট" হ'ল আমার সাপোর্টেডম্যাপফ্র্যাগমেন্ট এবং "আইভ" একটি চিত্রদর্শন (এটি ম্যাচ_পিতা তৈরি করুন)।

এবং এখানে আমি স্ক্রোলটি নিয়ন্ত্রণ করছি:

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) {}
    });

মানচিত্র (ফ্রেগমেন্টম্যাপ) সহ আমার খণ্ডটি অবস্থান 1 এ রয়েছে, সুতরাং আমার অবস্থান 0 থেকে 1 এবং অবস্থান 1 থেকে 2 (প্রথম যদি-ধারা) থেকে স্ক্রোলটি নিয়ন্ত্রণ করা দরকার। "getRegectedFraament ()" আমার কাস্টম ফ্রেগমেন্টপেজারএডাপ্টারের একটি ফাংশন, যাতে আমার কাছে "নিবন্ধিতফ্রেগমেন্টস" নামক একটি স্পার্সআরে (খণ্ড) রয়েছে।

সুতরাং, আপনি যখনই নিজের মানচিত্রে বা থেকে স্ক্রোল করছেন, আপনি সর্বদা এটির একটি স্ন্যাপশট দেখতে পাবেন। এটি আমার পক্ষে খুব ভাল কাজ করে।


অন্যান্য উত্তরগুলি আমার পক্ষে কার্যকর হয়নি - এটি কেবলমাত্র কাজ করেছিল। ধন্যবাদ!
এলিস_সিলভার_ম্যান

4

আমার কাছে লিস্ট ভিউয়ের স্ক্রোলিংয়ের কালো পর্দার একই সমস্যা ছিল, আমি একই পর্দার তালিকার সাথে মানচিত্রের খণ্ডটি ব্যবহার করছি আমি এক্সএমএলে icalন্দ্রজালিক সম্পত্তি ব্যবহার করে এই সমস্যাটি সমাধান করেছি যেখানে আমি তালিকার সাথে কথা বলছি কেবলমাত্র অ্যান্ড্রয়েড রাখতে হবে: scrollingCache = "false"। আমার ইস্যু ঠিক হয়ে গেছে আপনার মানচিত্রে পিছিয়ে থাকা এবং ঝাঁকুনি থামানোর জন্য এই সম্পত্তিটি ব্যবহার করে দেখুন।


2

আপনি খুব বেশি বিশদ দেননি তাই কেবলমাত্র আমি প্রস্তাব করতে পারি। আমার একইরকম সমস্যা ছিল যা প্যাজারে থাকা দৃশ্যের মধ্যে পর্দা ঝলকিয়েছিল। এটি প্রথমবার পৃষ্ঠাগুলির মধ্যে অদলবদল করার সময় মানচিত্রের ভিউতে স্ফীত হয়ে উঠেছে।

পরিষ্কার হওয়ার জন্য আমার পেজারে আমার 3 টি পৃষ্ঠা ছিল এবং আমার মানচিত্রটি সর্বশেষ পৃষ্ঠা ছিল।

এটি সমাধান করার জন্য আমি খুঁজে পেয়েছি যে অফ স্ক্রিন পৃষ্ঠাগুলির সংখ্যা 2 এ সেট করা হয়েছে (এটি উপরের ক্ষেত্রে এটি কাজ করেছে) যে যখন আমার খণ্ডটি শুরু হয়েছিল তখন এটি সমস্ত দর্শন একবারে লোড করে দেয়।

দেখুন http://developer.android.com/reference/android/support/v4/view/ViewPager.html#setOffscreenPageLimit (int-)


ধন্যবাদ, কিন্তু কাজ হয়নি। সমস্যাটি হ'ল স্ক্রিনের অংশটি মানচিত্রে আচ্ছাদিত, যখন অন্য খণ্ডে পরিবর্তিত হয়, তখন কালো থাকে, এই অন্যান্য খণ্ডের দৃশ্যকে coveringেকে রাখে।
পেপ

হুঁ মম। আমি এই সম্পর্কে একটি চিন্তা করা হবে।
গ্রাহাম স্মিথ

ইউ-লিঙ্কযুক্ত এই পৃষ্ঠায় সেটঅফস্ক্রিন পৃষ্ঠা লিমিটটি আমি খুঁজে পাচ্ছি না
এমপ্লুংজান

0

এই সমস্যার আরও একটি সমাধান রয়েছে। আমি অন্য খণ্ডের মধ্যে ম্যাপফ্র্যাগমেন্ট দেখছি। ম্যাপফ্র্যাগমেন্টটি গতিশীলভাবে ফ্রেম-লেআউটে যুক্ত করা হয়েছে।

সমাধানটি স্লাইডিং মেনুর খোলা এবং ঘনিষ্ঠ ইভেন্টগুলিতে ফ্রেমলআউট.সেটভিজিবিলিটি (ভিউ.ভিজিবল) এবং ফ্রেমলয়আউট.সেটভিজিবিলিটি (View.Gone) ব্যবহার করা। এটি অনুমোদন করার জন্য একটি অতিরিক্ত ভিউ যুক্ত করা প্রয়োজন। আর কৃষ্ণ অঞ্চল পুরোপুরি চলে গেছে।

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

উপরের কোনও পদ্ধতিই আমার পক্ষে কাজ করে নি, এমনকি অন্য কোথাও আমি অন্য কোথাও খুঁজে পেয়েছি। অবশেষে, আমি একটি আংশিক সমাধান বেছে নিয়েছি। আমি ভিউপ্যাজারের অন পেজচ্যাঞ্জলিস্টনার এর মাধ্যমে পৃষ্ঠার পরিবর্তনগুলি শুনি এবং এর পৃষ্ঠাটি যখন স্ক্রোলিং শুরু হয় তখন মানচিত্রটি আড়াল করি এবং একইভাবে এটি যখন স্ক্রোলিং বন্ধ করে দেয় তখন তা আবার দেখায়। স্ক্রোল করার সময় প্রদর্শিত হওয়ার জন্য আমি একটি সাদা ভিউও যুক্ত করেছি।


ভিউটির বর্তমান চিত্রটি একটি বিটম্যাপে ক্যাপচার করার জন্য এটি আরও বাড়ানো যেতে পারে এবং তারপরে পেজার স্ক্রল করার সময় এটি একটি চিত্রভিউতে প্রদর্শিত হবে। এইভাবে, ব্যবহারকারীরা এর পিছনে হ্যাকটি লক্ষ্য করবে না। যাইহোক, আমি এই গণনাটি কিছুটা ব্যয়বহুল পেয়েছি কারণ এটি সোয়াইপিংয়ের জন্য ইউআইয়ের প্রতিক্রিয়াটি ধীর করে দেবে।
azyoot

-2

আপনার প্রকল্পে আমার কাস্টম মানচিত্রের খণ্ডটি অনুলিপি করুন। এবং যদি আপনার স্ক্রোলভিউ অ্যান্ড্রয়েডের উপরে এবং নীচে স্ক্রোলভিউয়ের সাথে কালো রেখাগুলি থাকে: 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();
}

}

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.