Com.google.android.gms.maps.MapFragment এর জন্য অন্য একটি খণ্ডের সাথে ডুপ্লিকেট আইডি, ট্যাগ নাল, বা প্যারেন্ট আইডি


333

আমার কাছে তিনটি ট্যাব সহ একটি অ্যাপ্লিকেশন রয়েছে।

প্রতিটি ট্যাবের নিজস্ব লেআউট। XML ফাইল রয়েছে। মেইন.এক্সএমএল এর নিজস্ব মানচিত্রের খণ্ড রয়েছে। অ্যাপ্লিকেশন প্রথম চালু হওয়ার সময় এটিই প্রদর্শিত হয়।

আমি যখন ট্যাবগুলির মধ্যে পরিবর্তন করি তা বাদে সবকিছু ঠিকঠাক কাজ করে। আমি যদি মানচিত্রের টুকরো ট্যাবটিতে ফিরে যেতে চেষ্টা করি তবে আমি এই ত্রুটিটি পেয়েছি। অন্যান্য ট্যাবগুলিতে এবং এর মধ্যে স্যুইচ করা ঠিক কাজ করে।

এখানে কী ভুল হতে পারে?

এটি আমার প্রধান ক্লাস এবং আমার মেইন.এমএমএল, পাশাপাশি আমি ব্যবহার করি এমন একটি প্রাসঙ্গিক ক্লাস (আপনি নীচে ত্রুটি লগটিও খুঁজে পাবেন)

প্রধান শ্রেণি

package com.nfc.demo;

import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.widget.Toast;

public class NFCDemoActivity extends Activity {

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ActionBar bar = getActionBar();
        bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);

        bar.addTab(bar
                .newTab()
                .setText("Map")
                .setTabListener(
                        new TabListener<MapFragment>(this, "map",
                                MapFragment.class)));
        bar.addTab(bar
                .newTab()
                .setText("Settings")
                .setTabListener(
                        new TabListener<SettingsFragment>(this, "settings",
                                SettingsFragment.class)));
        bar.addTab(bar
                .newTab()
                .setText("About")
                .setTabListener(
                        new TabListener<AboutFragment>(this, "about",
                                AboutFragment.class)));

        if (savedInstanceState != null) {
            bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0));
        }
        // setContentView(R.layout.main);

    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt("tab", getActionBar().getSelectedNavigationIndex());
    }

    public static class TabListener<T extends Fragment> implements
            ActionBar.TabListener {
        private final Activity mActivity;
        private final String mTag;
        private final Class<T> mClass;
        private final Bundle mArgs;
        private Fragment mFragment;

        public TabListener(Activity activity, String tag, Class<T> clz) {
            this(activity, tag, clz, null);
        }

        public TabListener(Activity activity, String tag, Class<T> clz,
                Bundle args) {
            mActivity = activity;
            mTag = tag;
            mClass = clz;
            mArgs = args;

            // Check to see if we already have a fragment for this tab,
            // probably from a previously saved state. If so, deactivate
            // it, because our initial state is that a tab isn't shown.
            mFragment = mActivity.getFragmentManager().findFragmentByTag(mTag);
            if (mFragment != null && !mFragment.isDetached()) {
                FragmentTransaction ft = mActivity.getFragmentManager()
                        .beginTransaction();
                ft.detach(mFragment);
                ft.commit();
            }
        }

        public void onTabSelected(Tab tab, FragmentTransaction ft) {
            if (mFragment == null) {
                mFragment = Fragment.instantiate(mActivity, mClass.getName(),
                        mArgs);
                ft.add(android.R.id.content, mFragment, mTag);
            } else {
                ft.attach(mFragment);
            }
        }

        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
            if (mFragment != null) {
                ft.detach(mFragment);
            }
        }

        public void onTabReselected(Tab tab, FragmentTransaction ft) {
            Toast.makeText(mActivity, "Reselected!", Toast.LENGTH_SHORT)
                         .show();
        }
    }

}

main.xml

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

    <fragment
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/mapFragment"
        android:name="com.google.android.gms.maps.MapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

প্রাসঙ্গিক শ্রেণি (ম্যাপফ্রেগমেন্ট.জভা)

package com.nfc.demo;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class MapFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        return inflater.inflate(R.layout.main, container, false);
    }

    public void onDestroy() {
        super.onDestroy();
    }
}

ত্রুটি

android.view.InflateException: Binary XML file line #7: 
     Error inflating class fragment
   at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
   at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
   at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
   at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
   at com.nfc.demo.MapFragment.onCreateView(MapFragment.java:15)
   at android.app.Fragment.performCreateView(Fragment.java:1695)
   at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:885)
   at android.app.FragmentManagerImpl.attachFragment(FragmentManager.java:1255)
   at android.app.BackStackRecord.run(BackStackRecord.java:672)
   at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1435)
   at android.app.FragmentManagerImpl$1.run(FragmentManager.java:441)
   at android.os.Handler.handleCallback(Handler.java:725)
   at android.os.Handler.dispatchMessage(Handler.java:92)
   at android.os.Looper.loop(Looper.java:137)
   at android.app.ActivityThread.main(ActivityThread.java:5039)
   at java.lang.reflect.Method.invokeNative(Native Method)
   at java.lang.reflect.Method.invoke(Method.java:511)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
   at dalvik.system.NativeStart.main(Native Method)

Caused by: java.lang.IllegalArgumentException: 
     Binary XML file line #7: Duplicate id 0x7f040005, tag null, or 
     parent id 0xffffffff with another fragment for 
     com.google.android.gms.maps.MapFragment
   at android.app.Activity.onCreateView(Activity.java:4722)
   at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:680)
   ... 19 more

এটি ব্যবহার করে দেখুন - সুপার.অনক্রিটভিউ (স্ফীতকারী, ধারক, সেভড ইনস্ট্যান্সস্টেট) রিটার্ন করুন; সুপার.অনক্রিয়েটভিউয়ের পরিবর্তে (স্ফীতকারী, ধারক, সেভড ইনস্ট্যান্সস্টেট); রিটার্ন inflater.inflate (R.layout.main, ধারক, মিথ্যা);
নিক

যখন সেভড ইনস্ট্যান্সস্টেটটি বাতিল নয় তখন আপনি খণ্ড যুক্ত করবেন না।
মিউইউ

এই মন্তব্য একবার দেখুন। এটি আপনাকে সাহায্য করতে পারে: স্ট্যাকওভারফ্লো
ওলেকসান্ডার

2
গৃহীত উত্তর পরিবর্তন করুন! আপনি একটি খুব খারাপ উত্তর বাছাই করেছেন যা মেমরি ফাঁস তৈরি করে! : সঠিক উত্তরটি এই হল stackoverflow.com/a/19815266/902276
ড্যানিয়েল Segato

উত্তর:


400

ম্যাট উত্তরটি কাজের প্রস্তাব দেয় তবে এটি মানচিত্রটিকে পুনরায় তৈরি এবং পুনরায় চিত্রিত করে, যা সর্বদা কাম্য নয়। প্রচুর পরীক্ষা এবং ত্রুটির পরেও আমি একটি সমাধান পেয়েছি যা আমার পক্ষে কাজ করে:

private static View view;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    if (view != null) {
        ViewGroup parent = (ViewGroup) view.getParent();
        if (parent != null)
            parent.removeView(view);
    }
    try {
        view = inflater.inflate(R.layout.map, container, false);
    } catch (InflateException e) {
        /* map is already there, just return view as it is */
    }
    return view;
}

ভাল পরিমাপের জন্য, এখানে আর.আই.ডি.ম্যাপফ্র্যাগমেন্ট (অ্যান্ড্রয়েড: আইডি = "@ + আইডি / ম্যাপফ্র্যাগমেন্ট") সহ "map.xML" (R.layout.map):

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

    <fragment xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/mapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="com.google.android.gms.maps.SupportMapFragment" />
</LinearLayout>

আমি আশা করি এটি সাহায্য করে তবে আমি গ্যারান্টি দিতে পারি না যে এর কোনও প্রতিকূল প্রভাব নেই।

সম্পাদনা করুন: কিছু বিরূপ প্রভাব ছিল যেমন অ্যাপ্লিকেশনটি থেকে বেরিয়ে এসে আবার শুরু করার সময়। যেহেতু অ্যাপ্লিকেশনটি অগত্যা পুরোপুরি বন্ধ হয়ে যায় না (তবে কেবল পটভূমিতে ঘুমিয়ে পড়ে), আমি প্রেরিত আগের কোডটি অ্যাপ্লিকেশনটি পুনরায় চালু করার পরে ব্যর্থ হবে। আমি কোডটি এমন কিছুতে আপডেট করেছি যা আমার জন্য কার্যকর হয়, উভয়ই মানচিত্রের বাইরে চলে যাওয়া এবং অ্যাপ্লিকেশনটি বের করা এবং পুনরায় চালু করা, আমি চেষ্টা-বিটটি নিয়ে খুব খুশি নই, তবে এটি যথেষ্ট কার্যকরভাবে কাজ করছে বলে মনে হচ্ছে। স্ট্যাক ট্রেসটির দিকে তাকানোর সময় আমার কাছে এটি ঘটেছিল যে আমি ঠিক খালি চেক করতে পারি যে মানচিত্রের খণ্ডটি ফ্রেগমেন্টম্যানেজারে রয়েছে কিনা, চেষ্টা-ব্লক, কোড আপডেটের প্রয়োজন নেই।

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


25
এটি ভুল উত্তর -১! আপনি একটি দৃশ্যের জন্য স্ট্যাটিক সংশোধক ব্যবহার করে একটি কার্যকলাপ ফাঁস করছেন। এই সমস্যার মূল কারণ হ'ল সম্ভবত আরও একটি ফাঁস হওয়া ক্রিয়াকলাপ, এটি আবর্জনা সংগ্রহ করা যাবে না কারণ আপনি দৃ strong় রেফারেন্স এটিকে নির্দেশ করছেন। যদি কোনও inflateException নিক্ষেপ করা হয়, আপনি ধ্বংসের ক্রিয়াকলাপের প্রসঙ্গ আছে এমন একটি দৃশ্য ব্যবহার করছেন! আপনার অ্যাপ্লিকেশনে অন্যান্য মেমরি ফুটো করা ভাল, এটি সমস্ত সমস্যার সমাধান করবে।
টমরোজব

1
আমার ধারণা আমরা মেমরি ফাঁস এড়াতে WeakReferences ব্যবহার করতে পারি?
ডেসমন্ড লুয়া

2
এটি আমার জন্যও +1 কাজ করে। স্থির দৃশ্যের রেফারেন্সটি ব্যবহার করতে আপনি বাধ্য নন
করোল olygłowicz

4
এটা করবেন না !!! এটি স্মৃতি ফাঁসির কারণ হয়। এটি হওয়ার একমাত্র কারণ হ'ল আপনি এক্সএমএল থেকে অন্য একটি খণ্ডের অভ্যন্তরে কোনও টুকরো স্ফীত করছেন। আপনি এটি করার কথা না! আপনার চাইল্ডফ্রেগমেন্ট ম্যানেজারটি ব্যবহার করা উচিত এবং অনভিউ তৈরি করা () তে টুকরো যোগ করা উচিত!
ড্যানিয়েলে সেগাটো

1
হ্যাঁ, এটি অবশ্যই ক্রিয়াকলাপ ফাঁস করবে। স্ট্যাকওভারফ্লো . com/ a/ 27592123/683763 এ একটি কাজের সমাধান খুঁজে পেয়েছে । ধারণাটি হ'ল ম্যানুয়ালি SupportMapFragmentইন onDestroyViewপদ্ধতিটি সরিয়ে ফেলতে হবে ।
ULazdins

277

সমস্যাটি হ'ল আপনি যা করার চেষ্টা করছেন তা করা উচিত নয়। আপনি অন্য টুকরো টুকরো টুকরো টুকরো টুকরো করা উচিত নয়। অ্যান্ড্রয়েডের ডকুমেন্টেশন থেকে :

দ্রষ্টব্য: আপনি যখন কোনও লেআউটে <ফ্রেম> অন্তর্ভুক্ত করেন তখন কোনও খণ্ডে কোনও বিন্যাস স্ফীত করতে পারবেন না। নেস্টেড টুকরোগুলি কেবল তখনই কার্যকর হয় যখন গতিশীলভাবে কোনও খণ্ডে যুক্ত করা হয়।

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

অন্য টুকরাটিতে একটি টুকরো যোগ করার একমাত্র অ্যান্ড্রয়েড-সমর্থিত উপায় হ'ল শিশু খণ্ড পরিচালক এর লেনদেন।

খালি আপনার এক্সএমএল লেআউটটি খালি পাত্রে পরিবর্তন করুন (প্রয়োজনে একটি আইডি যুক্ত করুন):

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

তারপরে খণ্ড onViewCreated(View view, @Nullable Bundle savedInstanceState)পদ্ধতিতে:

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    FragmentManager fm = getChildFragmentManager();
    SupportMapFragment mapFragment = (SupportMapFragment) fm.findFragmentByTag("mapFragment");
    if (mapFragment == null) {
        mapFragment = new SupportMapFragment();
        FragmentTransaction ft = fm.beginTransaction();
        ft.add(R.id.mapFragmentContainer, mapFragment, "mapFragment");
        ft.commit();
        fm.executePendingTransactions();
    }
    mapFragment.getMapAsync(callback);
}

4
প্রোগ্রামেমেটিকভাবে মানচিত্রের খণ্ড তৈরি এবং মানচিত্রের সূচনা করার উদাহরণগুলির জন্য স্ট্যাকওভারফ্লো.com/ প্রশ্নগুলি / 13733299/… দেখুন ।
ক্রিস্টোফার জনসন

1
শিশু খণ্ড সমর্থনে আপগ্রেড বাগের জন্য কার্যবিধির জন্য স্ট্যাকওভারফ্লো.com/ জিজ্ঞাসাগুলি / ১৯৩৯ 919175৫/২ দেখুন ।
ক্রিস্টোফার জনসন

এক্সএমএলে সংজ্ঞায়িত 4.3ব্যবহার করার সময় আমি এই সমস্যার মুখোমুখি হয়েছি SupportMapFragment। গতিশীলভাবে খণ্ড তৈরি করা এবং এটি একটি ধারক দৃশ্যে ইনজেকশনের মাধ্যমে সমস্যার সমাধান হয়েছে। এই এসও উত্তর দেখুন
theblang

খুব দরকারী উত্তর। আমরা কীভাবে অনক্রিট () মূল ফাংশনে কলব্যাক করতে পারি?
ইউটোপিয়া

2
দস্তাবেজ অনুসারে, SupportMapFragment.newInstance(); developers.google.com/maps/docamentation/android-api/map
জেমশিত ইস্কান্দেরভ

178

আমি একই সমস্যা ছিল এবং ম্যানুয়ালি সরিয়ে তা সমাধান করতে সক্ষম হন MapFragmentযে onDestroy()পদ্ধতি Fragmentবর্গ। এখানে কোড রয়েছে যা MapFragmentXML- এ আইডি দ্বারা কাজ করে এবং রেফারেন্স করে :

@Override
public void onDestroyView() {
    super.onDestroyView();
    MapFragment f = (MapFragment) getFragmentManager()
                                         .findFragmentById(R.id.map);
    if (f != null) 
        getFragmentManager().beginTransaction().remove(f).commit();
}

আপনি যদি MapFragmentম্যানুয়ালি অপসারণ না করেন তবে এটি চারদিকে ঝুলবে যাতে মানচিত্রের দৃশ্যটি পুনরায় তৈরি / দেখানোর জন্য প্রচুর সংস্থান ব্যয় না হয়। মনে হচ্ছে যে পালন অন্তর্নিহিত MapViewআগে পিছে ট্যাবগুলির মধ্যে স্যুইচ করার জন্য মহান, কিন্তু টুকরা ব্যবহৃত এই আচরণ সদৃশ ঘটায় MapViewপ্রতিটি নতুন উপরে তৈরি করা MapFragmentএকই আইডি-র। সমাধানটি হ'ল ম্যানুয়ালি মুছে ফেলা MapFragmentএবং এভাবে খণ্ডটি স্ফীত হওয়ার সাথে সাথে অন্তর্নিহিত মানচিত্রটি পুনরায় তৈরি করুন।

আমি অন্য উত্তরে এটিও লক্ষ্য করেছি [ 1 ]।


বিকাশকারী বিকল্পগুলিতে "ক্রিয়াকলাপগুলি রাখবেন না" সহ ডিভাইসের হোম বোতামে ক্লিক করার সময় এটি অ্যাপটিকে ক্র্যাশ করে তোলে।
জুলাই

24
এটি কাজ করে, তবে আমি যদি আমার স্ক্রিনটি ঘোরান, তবে আমার অ্যাপ্লিকেশনটি এই ব্যতিক্রম সহ ক্র্যাশ হয়ে গেছে: এর কারণ: java.lang.IllegalStateException: onSaveInstanceState- এর পরে এই ক্রিয়াটি সম্পাদন করতে পারবেন না
jramoyo

1
যারা আগ্রহী হতে পারে তাদের জন্য, আপনি খণ্ডের কনস্ট্রাক্টারে ইনরিয়েন্টিয়াল অরিয়েন্টেশন সংরক্ষণ করে ওরিয়েন্টেশন পরিবর্তন না করা হলে কেবল উপরের লেনদেন কল করে স্ক্রিন রোটেশন দ্বারা সৃষ্ট ব্যতিক্রমগুলি অপসারণ করতে পারেন। যদি এটি পরিবর্তন করা হয় তবে ডুপ্লিকেট আইডি নিয়ে লড়াই করার দরকার নেই, কারণ ঘূর্ণনের পরে যখন নতুনভাবে তৈরি করা হয় তখন তা হয় না। আমি উত্তরটি সম্পাদনা করতে এবং একটি কোড স্নিপেট সরবরাহ করতে পারি, যদি ম্যাট কিছু মনে করেন না।
স্ট্যান

1
হুম আমার জন্য মানচিত্রের খণ্ডটি সরানো হচ্ছে না। আমি অবশ্যই কিছু ভুল করছি কিন্তু আমি যদি getActivity ()। GetSupportFraamentManager ()। GetFrations () কল করি তবে কলটি রিমুভ (চ) .কমিট করার পরে খণ্ডটি রয়ে গেছে। কারও কি ধারণা আছে কেন? (আমি getFragManager কে getSupportFragManager এর সাথে প্রতিস্থাপন করেছি)
ড্যানিয়েল উইলসন

10
কমিটএলিংস্টেটলস ইলিজালস্টেটএক্সেপশন ব্যতিক্রম এড়াতে পারবে।
হেক্টর জেদেজ সপেনা

22

এটি আমার উত্তর:

1, নিম্নলিখিতগুলির মতো একটি লেআউট এক্সএমএল তৈরি করুন:

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

2, টুকরো টুকরো ক্লাসে একটি গুগল ম্যাপ প্রোগ্রামযুক্তভাবে যুক্ত করুন।

import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * A simple {@link android.support.v4.app.Fragment} subclass. Activities that
 * contain this fragment must implement the
 * {@link MapFragment.OnFragmentInteractionListener} interface to handle
 * interaction events. Use the {@link MapFragment#newInstance} factory method to
 * create an instance of this fragment.
 * 
 */
public class MapFragment extends Fragment {
    // TODO: Rename parameter arguments, choose names that match
    private GoogleMap mMap;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_map, container, false);
        SupportMapFragment mMapFragment = SupportMapFragment.newInstance();
        mMap = mMapFragment.getMap();
        FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
        transaction.add(R.id.map_container, mMapFragment).commit();
        return view;
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        Log.d("Attach", "on attach");
    }

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

2
mMapFragment.getMap();আয় null। কোন ধারণা কেন?
আনাস আজিম

@ আনাসআজেম, টুকরো টুকরো টানা কর্মসূচী তৈরির ফলে সমস্যাটি ঠিক ঠিক সমাধান করা যায়, সম্ভবত আপনার ক্ষেত্রে সমাধানের জন্য আপনাকে এমএম্যাপ নিতে হবে না।
ইয়েলিল্ডাল

@ আনাসআজেম আপনার getMapAsync ব্যবহার করা উচিত যা প্রাথমিকভাবে (পটভূমিতে) শুরু করার পরে মানচিত্রের উদাহরণটি সঠিকভাবে ফিরে আসবে। এটি গুগল ম্যাপের সাথে কাজ করার "সঠিক" উপায় এবং খণ্ডগুলির সাথে কিছুই করার নেই
গণেশ কৃষ্ণন

10
  1. @ জাস্টিন ব্রেটফেলার দ্বারা উল্লিখিত হিসাবে, @ বিদার ওয়াহালবার্গ সলিউশন হ্যাক যা ভবিষ্যতে অ্যান্ড্রয়েডের সংস্করণে কাজ না করে।
  2. @ বিদার ওয়াহলবার্গ একটি হ্যাক দেখেছে কারণ অন্যান্য সমাধান "মানচিত্রটিকে পুনরায় তৈরি এবং পুনরায় চিত্রিত করতে পারে, যা সর্বদা কাম্য নয়"। পুরানো মানচিত্রের খণ্ডগুলি বজায় রেখে প্রতিবার নতুন উদাহরণ তৈরি করার পরিবর্তে মানচিত্রের পুনরায় চিত্র প্রতিরোধ করা যেতে পারে।
  3. @ ম্যাট সলিউশন আমার পক্ষে কাজ করে না (ইলিজালস্টেট স্টেপশন)
  4. @ জাস্টিন ব্রেইটফেলার এর উদ্ধৃতি অনুসারে, "আপনি যখন কোনও লেআউটটিকে কোনও টুকরো টুকরো টানতে পারবেন না যখন নেটিভ টুকরো কেবল তখনই সমর্থনযোগ্য যখন কোনও খণ্ডে গতিশীলভাবে যুক্ত হয়।"

আমার সমাধান:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,                              Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_map_list, container, false);

    // init
    //mapFragment = (SupportMapFragment)getChildFragmentManager().findFragmentById(R.id.map);
    // don't recreate fragment everytime ensure last map location/state are maintain
    if (mapFragment == null) {
        mapFragment = SupportMapFragment.newInstance();
        mapFragment.getMapAsync(this);
    }
    FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
    // R.id.map is a layout
    transaction.replace(R.id.map, mapFragment).commit();

    return view;
}

2
ধন্যবাদ @ ডেডমন্ড আপনার সমাধানটি আমার পক্ষে নির্দ্বিধায় কাজ করেছে। লেআউটে মানচিত্র তৈরি না করা আপনার কেবলমাত্র একটি জিনিস মনে রাখতে হবে। এই সমাধানে মানচিত্র তৈরি কোডটিতে এম্বেড করা হয়েছে সুতরাং <ফ্রেগমেন্ট অ্যান্ড্রয়েড: নাম = "com.google.android.gms.maps.SupportMapFraament"> উদাহরণস্বরূপ <লিনিয়ারআউট আইডি = "@ + আইডি / মানচিত্র />
কোসিয়ারা - বার্টোস কোসারজিকি

7

সাপোর্টম্যাপফ্রেগমেন্ট অবজেক্টটি বিশ্বব্যাপী ঘোষণা করুন

    private SupportMapFragment mapFragment;

অনক্রিয়েটভিউ () পদ্ধতিতে কোডের নীচে রাখুন

mapFragment = (SupportMapFragment) getChildFragmentManager()
            .findFragmentById(R.id.map);
 mapFragment.getMapAsync(this);

অনডেস্ট্রয়ভিউতে () কোড নীচে রাখুন

@Override
public void onDestroyView() {
   super.onDestroyView();

    if (mapFragment != null)
        getFragmentManager().beginTransaction().remove(mapFragment).commit();
}

আপনার এক্সএমএল ফাইলটিতে কোডের নীচে রাখুন

 <fragment
    android:id="@+id/map"
    android:name="com.abc.Driver.fragment.FragmentHome"
    class="com.google.android.gms.maps.SupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    />

উপরে কোডটি আমার সমস্যা সমাধান করেছে এবং এটি ঠিকঠাক কাজ করছে


3

আমি আপনার ট্যাব হ্যান্ডলিংয়ের replace()পরিবর্তে attach()/ সুপারিশ করব detach()

অথবা, এ স্যুইচ করুন ViewPagerএখানেViewPager 10 টি মানচিত্রের ট্যাব সহ একটি নমুনা প্রকল্প দেখানো হচ্ছে ।


তবে মানচিত্রের সমস্যা দেখা দেওয়ার চেয়ে আমরা বিচ্ছিন্ন উইন্ডোটি ব্যবহার করি তবে কী করা উচিত তার চেয়ে আউট অফিমিয়ারি ত্রুটি প্রতিস্থাপন করুন।
বিশাল অ্যান্ড্রয়েড বিকাশকারী

3

আরেকটি সমাধান:

if (view == null) {
    view = inflater.inflate(R.layout.nearbyplaces, container, false);
}

এটি হ'ল নালাগুলি না হলে আপনার পিতামাতার কাছ থেকে অপসারণ এটি পুনরায় পুনর্নিবিষ্ট করার দরকার নেই এটি অপ্রয়োজনীয় পদক্ষেপ।


এটি আমার ক্ষেত্রে সেরা সমাধান। আমার নেভিগেশন গ্রাফের জন্য দুটি টুকরা ব্যবহার করার ফলে আমি সেই ত্রুটিটি পাচ্ছিলাম এবং এটি আমার সমস্যার সমাধান করেছে fixed
কেনেডি কাম্বো

এটি আমার ক্ষেত্রে সেরা সমাধান। আমার নেভিগেশন গ্রাফের জন্য দুটি টুকরা ব্যবহার করার ফলে আমি সেই ত্রুটিটি পাচ্ছিলাম এবং এটি আমার সমস্যার সমাধান করেছে fixed
কেনেডি কাম্বো

2

কারণটি খুঁজে পেতে আমি আজ ঘন্টা হারিয়েছি, ভাগ্যক্রমে এই সমস্যাটি ম্যাপফ্র্যাগমেন্ট বাস্তবায়নের কারণে নয়, দুর্ভাগ্যক্রমে, এটি কাজ করে না কারণ নেস্টেড টুকরো কেবল রেভার 11 এর সমর্থন লাইব্রেরির মাধ্যমে সমর্থিত।

আমার বাস্তবায়নে অ্যাকশনবারে (ট্যাবড মোডে) দুটি ট্যাব (কোনও ভিউপাগার নেই) সহ একটি ক্রিয়াকলাপ রয়েছে, একটিতে মানচিত্র এবং অন্যটিতে প্রবেশের তালিকা রয়েছে। অবশ্যই আমি আমার ট্যাব টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো ভিতরে ব্যবহার করতে বেশ নিখুঁত ছিলাম, এবং অ্যাপ্লিকেশন ক্র্যাশ হয়েছে যখনই আমি মানচিত্র-ট্যাব ফিরে।

(আমার ট্যাব-খণ্ডটি অন্য কোনও খণ্ডযুক্ত কোনও বিন্যাসকে স্ফীত করে দিলে একই সমস্যাটি আমারও ছিল)।

একটি বিকল্প হ'ল ম্যাপভিউ (ম্যাপফ্রেগমেন্টের পরিবর্তে) ব্যবহার করতে হবে, কিছু ওভারহেড থাকলেও (ম্যাপভিউ ডক্স দেখুন) লেপ.এক্সএমএল-এ ড্রপ-ইন প্রতিস্থাপন হিসাবে ম্যাপভিউ , অন্য বিকল্পটি রেভ .11 থেকে সমর্থন-লাইব্রেরিটি ব্যবহার করা হবে তবে তারপরে প্রোগ্রামেটিক পদ্ধতি গ্রহণ করুন) যেহেতু নেস্টেড টুকরাগুলি লেআউটের সাহায্যে সমর্থিত নয় Or বা কেবল স্পষ্টভাবে টুকরোটি (ম্যাট / বিদার উত্তর হিসাবে) ধ্বংস করে প্রোগ্রামটিমে চারপাশে কাজ করা, বিটিডব্লিউ: একই প্রভাবটি ম্যাপভিউ (বিকল্প 1) ব্যবহার করে অর্জিত হয়েছে।

তবে প্রকৃতপক্ষে, আমি যখনই ট্যাবটি দূরে সরিয়েছি তখন আমি মানচিত্রটি আলগা করতে চাইনি, অর্থাৎ আমি কেবল ক্রিয়াকলাপের সময় এটি মেমরি এবং ক্লিনআপে রাখতে চেয়েছিলাম, তাই ট্যাব করার সময় আমি কেবল মানচিত্রটি আড়াল / প্রদর্শন করার সিদ্ধান্ত নিয়েছি, ফ্রেগমেন্ট ট্রান্সজেকশন / লুকান


2

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

আমি সবেমাত্র তৃতীয় ট্যাবে সাপোর্টম্যাপফ্র্যাগমেন্ট ViewPagerসহ একটি ব্যবহার করে এটি পেয়েছি FragmentPagerAdapter

এখানে সাধারণ কাঠামো রয়েছে, নোট করুন যে onCreateView()পদ্ধতিটি ওভাররাইড করার দরকার নেই এবং কোনও লেআউট এক্সএমএল বাড়ানোর দরকার নেই:

public class MapTabFragment extends SupportMapFragment 
                                    implements OnMapReadyCallback {

    private GoogleMap mMap;
    private Marker marker;


    public MapTabFragment() {
    }

    @Override
    public void onResume() {
        super.onResume();

        setUpMapIfNeeded();
    }

    private void setUpMapIfNeeded() {

        if (mMap == null) {

            getMapAsync(this);
        }
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {

        mMap = googleMap;
        setUpMap();
    }

    private void setUpMap() {

        mMap.setMyLocationEnabled(true);
        mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        mMap.getUiSettings().setMapToolbarEnabled(false);


        mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {

            @Override
            public void onMapClick(LatLng point) {

                //remove previously placed Marker
                if (marker != null) {
                    marker.remove();
                }

                //place marker where user just clicked
                marker = mMap.addMarker(new MarkerOptions().position(point).title("Marker")
                        .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA)));

            }
        });

    }


}

ফলাফল:

এখানে চিত্র বর্ণনা লিখুন

আমি এখানে পূর্ণ বর্গের কোডটি দিয়ে পরীক্ষা করেছি যা প্রথম দুটি ট্যাবের জন্য ব্যবহৃত স্থানধারক খণ্ড এবং তৃতীয় ট্যাবের জন্য ব্যবহৃত মানচিত্রের খণ্ডকে অন্তর্ভুক্ত করেছে:

public class MainActivity extends AppCompatActivity implements ActionBar.TabListener{


    SectionsPagerAdapter mSectionsPagerAdapter;

    ViewPager mViewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

        // Set up the ViewPager with the sections adapter.
        mViewPager = (ViewPager) findViewById(R.id.pager);
        mViewPager.setAdapter(mSectionsPagerAdapter);

        final ActionBar actionBar = getSupportActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                actionBar.setSelectedNavigationItem(position);
            }
        });

        for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
            actionBar.addTab(actionBar.newTab().setText(mSectionsPagerAdapter.getPageTitle(i)).setTabListener(this));
        }

    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        int id = item.getItemId();

        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
        mViewPager.setCurrentItem(tab.getPosition());
    }

    @Override
    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {

    }

    @Override
    public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {

    }


    public class SectionsPagerAdapter extends FragmentPagerAdapter {

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

        @Override
        public Fragment getItem(int position) {

            switch (position) {
                case 0:
                    return PlaceholderFragment.newInstance(position + 1);
                case 1:
                    return PlaceholderFragment.newInstance(position + 1);
                case 2:
                    return MapTabFragment.newInstance(position + 1);
            }

            return null;
        }

        @Override
        public int getCount() {
            // Show 3 total pages.
            return 3;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            Locale l = Locale.getDefault();

            switch (position) {
                case 0:
                    return getString(R.string.title_section1).toUpperCase(l);
                case 1:
                    return getString(R.string.title_section2).toUpperCase(l);
                case 2:
                    return getString(R.string.title_section3).toUpperCase(l);
            }
            return null;
        }
    }


    public static class PlaceholderFragment extends Fragment {

        private static final String ARG_SECTION_NUMBER = "section_number";

        TextView text;

        public static PlaceholderFragment newInstance(int sectionNumber) {
            PlaceholderFragment fragment = new PlaceholderFragment();
            Bundle args = new Bundle();
            args.putInt(ARG_SECTION_NUMBER, sectionNumber);
            fragment.setArguments(args);
            return fragment;
        }

        public PlaceholderFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_main, container, false);

            text = (TextView) rootView.findViewById(R.id.section_label);
            text.setText("placeholder");

            return rootView;
        }
    }

    public static class MapTabFragment extends SupportMapFragment implements
            OnMapReadyCallback {

        private static final String ARG_SECTION_NUMBER = "section_number";

        private GoogleMap mMap;
        private Marker marker;


        public static MapTabFragment newInstance(int sectionNumber) {
            MapTabFragment fragment = new MapTabFragment();
            Bundle args = new Bundle();
            args.putInt(ARG_SECTION_NUMBER, sectionNumber);
            fragment.setArguments(args);
            return fragment;
        }

        public MapTabFragment() {
        }

        @Override
        public void onResume() {
            super.onResume();

            Log.d("MyMap", "onResume");
            setUpMapIfNeeded();
        }

        private void setUpMapIfNeeded() {

            if (mMap == null) {

                Log.d("MyMap", "setUpMapIfNeeded");

                getMapAsync(this);
            }
        }

        @Override
        public void onMapReady(GoogleMap googleMap) {
            Log.d("MyMap", "onMapReady");
            mMap = googleMap;
            setUpMap();
        }

        private void setUpMap() {

            mMap.setMyLocationEnabled(true);
            mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
            mMap.getUiSettings().setMapToolbarEnabled(false);


            mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {

                @Override
                public void onMapClick(LatLng point) {

                    Log.d("MyMap", "MapClick");

                    //remove previously placed Marker
                    if (marker != null) {
                        marker.remove();
                    }

                    //place marker where user just clicked
                    marker = mMap.addMarker(new MarkerOptions().position(point).title("Marker")
                            .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA)));

                    Log.d("MyMap", "MapClick After Add Marker");

                }
            });

        }
    }
}

2

আমি সমস্ত উত্তর সম্মান করি তবে আমি এই একটি লাইনারের সমাধানটি পেয়েছি: যদি n ট্যাবগুলির সংখ্যা হয় তবে:

 mViewPager.setOffscreenPageLimit(n);

উদাহরণ: উল্লিখিত ক্ষেত্রে:

 mViewPager.setOffscreenPageLimit(2);

পেজার দেখুন একটি সারি প্রয়োগ করে, সুতরাং আপনাকে এটির খণ্ডটি সরাতে হবে না। onCreateView কেবল একবার কল করা হয়।


1

আপনি দু'বার ফিরে আসছেন বা লেফটকে স্ফীত করছেন, কেবল একবারই স্ফীত করছেন কিনা তা পরীক্ষা করে দেখুন।



0

আপনি কি MapFragmentলেআউট ফাইলটিতে আপনার কাস্টম ক্লাসটি উল্লেখ করার চেষ্টা করছেন ?

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

    <fragment
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/mapFragment"
        android:name="com.nfc.demo.MapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

আপনি কি কাস্টম মানচিত্রের টুকরো com.nfc.demo.MapFragment
মিনা

আমি কোডটির লেখক নই - আমি সবে পোস্ট করা কোডটি ব্যবহার করেছি। তোমাকে হারমান জিজ্ঞাসা করতে হবে।
জেজেডি

0

আপনি যদি কেবলমাত্র ভিদার ওয়াহলবার্গের উত্তর ব্যবহার করেন তবে আপনি অন্যান্য ক্রিয়াকলাপটি (উদাহরণস্বরূপ) খুললে এবং মানচিত্রে ফিরে গেলে ত্রুটি পাবেন। অথবা আমার ক্ষেত্রে অন্যান্য ক্রিয়াকলাপ খুলুন এবং তারপরে নতুন ক্রিয়াকলাপ থেকে আবার খুলুন মানচিত্র (ব্যাক বোতাম ব্যবহার না করে)। তবে আপনি যখন ভিদার ওয়াহলবার্গ সমাধান এবং ম্যাট সলিউশন একত্রিত করবেন তখন আপনার ব্যতিক্রম হবে না।

বিন্যাস

<com.example.ui.layout.MapWrapperLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/map_relative_layout">

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/root">

        <fragment xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/map"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            class="com.google.android.gms.maps.SupportMapFragment" />
    </RelativeLayout>
</<com.example.ui.layout.MapWrapperLayout>

টুকরা

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    setHasOptionsMenu(true);
    if (view != null) {
        ViewGroup parent = (ViewGroup) view.getParent();
        if (parent != null){
            parent.removeView(view);
        }
    }
    try {
        view = inflater.inflate(R.layout.map_view, null);
        if(view!=null){
            ViewGroup root = (ViewGroup) view.findViewById(R.id.root);
...

@Override
public void onDestroyView() {
    super.onDestroyView();
    Fragment fragment = this.getSherlockActivity().getSupportFragmentManager().findFragmentById(R.id.map);
    if (fragment != null)
        getFragmentManager().beginTransaction().remove(fragment).commit();
}

0

আমার ভিউপিজারে এটি ছিল এবং ক্রাশটি হ'ল কারণ যে কোনও খণ্ডটির নিজস্ব ট্যাগ, ডুপ্লিকেট ট্যাগ বা আইডির একই অংশের অনুমতি নেই।


0

আমি মনে করি শিশু ফ্রেগমেন্টের জন্য পূর্ববর্তী অ্যাপ-কম্প্যাট লিবিতে কিছু বাগ ছিল bu আমি @ বিদার ওয়াহলবার্গ এবং @ ম্যাট এর উত্তরগুলি চেষ্টা করেছিলাম তারা আমার পক্ষে কাজ করেনি। অ্যাপকম্প্যাট লাইব্রেরি আপডেট করার পরে আমার কোড কোনও অতিরিক্ত প্রচেষ্টা ছাড়াই নিখুঁতভাবে চালিত হয়।


0

এখানে লক্ষ্য করার বিষয়গুলি হল আপনার অ্যাপ্লিকেশনটি দুটি ক্ষেত্রে দুটির মধ্যেই খারাপভাবে ক্রাশ হবে: -

1) মানচিত্রগুলির সাথে আবার খণ্ডগুলি পুনরায় ব্যবহার করতে ম্যাপভিউ ফ্রেগমেন্টটি অপসারণ করতে হবে যখন মানচিত্র দেখানো আপনার খণ্ডটি অন্টাস্ট্রয়েভিউ কলব্যাকে অন্য খণ্ডের সাথে প্রতিস্থাপিত হবে।

অন্যথায় যখন আপনি একই টুকরোগুলি দু'বার ডুপ্লিকেট আইডি, ট্যাগ নাল, বা প্যারেন্ট আইডির জন্য অন্য এক টুকরো দিয়ে com.google.android.gms.maps.MapFraਮੈਂਟ ত্রুটি ঘটবে।

২) দ্বিতীয়ত আপনার অবশ্যই অ্যাপ্লিকেশনটি মিশ্রিত করতে পারবেন না and android.support.v4.app.Fraਮੈਂਟ এপিআই অপারেশনগুলির সাথে ফ্রেমমেন্ট অপারেশনগুলি উদাহরণস্বরূপ v4.app অপসারণের জন্য android.app.FraamentTransaction ব্যবহার করবেন না ra ফ্রেগমেন্ট টাইপ ম্যাপভিউ ফ্রেগমেন্ট। এটি মিশ্রণের ফলে আবার খণ্ডের দিক থেকে ক্রাশ হবে।

মানচিত্রের সঠিক ব্যবহারের জন্য এখানে নমুনা কোড স্নিপেট

import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMap.OnMapClickListener;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.serveroverload.yago.R;

/**
 * @author 663918
 *
 */
public class HomeFragment extends Fragment implements LocationListener {
    // Class to do operations on the Map
    GoogleMap googleMap;
    private LocationManager locationManager;

    public static Fragment newInstance() {
        return new HomeFragment();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.home_fragment, container, false);
        Bundle bdl = getArguments();

        // setuping locatiomanager to perfrom location related operations
        locationManager = (LocationManager) getActivity().getSystemService(
                Context.LOCATION_SERVICE);

        // Requesting locationmanager for location updates
        locationManager.requestLocationUpdates(
                LocationManager.NETWORK_PROVIDER, 1, 1, this);

        // To get map from MapFragment from layout
        googleMap = ((MapFragment) getActivity().getFragmentManager()
                .findFragmentById(R.id.map)).getMap();

        // To change the map type to Satellite
        // googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);

        // To show our current location in the map with dot
        // googleMap.setMyLocationEnabled(true);

        // To listen action whenever we click on the map
        googleMap.setOnMapClickListener(new OnMapClickListener() {

            @Override
            public void onMapClick(LatLng latLng) {
                /*
                 * LatLng:Class will give us selected position lattigude and
                 * longitude values
                 */
                Toast.makeText(getActivity(), latLng.toString(),
                        Toast.LENGTH_LONG).show();
            }
        });

        changeMapMode(2);

        // googleMap.setSatellite(true);
        googleMap.setTrafficEnabled(true);
        googleMap.setBuildingsEnabled(true);
        googleMap.setMyLocationEnabled(true);

        return v;
    }

    private void doZoom() {
        if (googleMap != null) {
            googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(
                    new LatLng(18.520430, 73.856744), 17));
        }
    }

    private void changeMapMode(int mapMode) {

        if (googleMap != null) {
            switch (mapMode) {
            case 0:
                googleMap.setMapType(GoogleMap.MAP_TYPE_NONE);
                break;

            case 1:
                googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
                break;

            case 2:
                googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
                break;

            case 3:
                googleMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
                break;

            case 4:
                googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
                break;

            default:
                break;
            }
        }
    }

    private void createMarker(double latitude, double longitude) {
        // double latitude = 17.385044;
        // double longitude = 78.486671;

        // lets place some 10 random markers
        for (int i = 0; i < 10; i++) {
            // random latitude and logitude
            double[] randomLocation = createRandLocation(latitude, longitude);

            // Adding a marker
            MarkerOptions marker = new MarkerOptions().position(
                    new LatLng(randomLocation[0], randomLocation[1])).title(
                    "Hello Maps " + i);

            Log.e("Random", "> " + randomLocation[0] + ", " + randomLocation[1]);

            // changing marker color
            if (i == 0)
                marker.icon(BitmapDescriptorFactory
                        .defaultMarker(BitmapDescriptorFactory.HUE_AZURE));
            if (i == 1)
                marker.icon(BitmapDescriptorFactory
                        .defaultMarker(BitmapDescriptorFactory.HUE_BLUE));
            if (i == 2)
                marker.icon(BitmapDescriptorFactory
                        .defaultMarker(BitmapDescriptorFactory.HUE_CYAN));
            if (i == 3)
                marker.icon(BitmapDescriptorFactory
                        .defaultMarker(BitmapDescriptorFactory.HUE_GREEN));
            if (i == 4)
                marker.icon(BitmapDescriptorFactory
                        .defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA));
            if (i == 5)
                marker.icon(BitmapDescriptorFactory
                        .defaultMarker(BitmapDescriptorFactory.HUE_ORANGE));
            if (i == 6)
                marker.icon(BitmapDescriptorFactory
                        .defaultMarker(BitmapDescriptorFactory.HUE_RED));
            if (i == 7)
                marker.icon(BitmapDescriptorFactory
                        .defaultMarker(BitmapDescriptorFactory.HUE_ROSE));
            if (i == 8)
                marker.icon(BitmapDescriptorFactory
                        .defaultMarker(BitmapDescriptorFactory.HUE_VIOLET));
            if (i == 9)
                marker.icon(BitmapDescriptorFactory
                        .defaultMarker(BitmapDescriptorFactory.HUE_YELLOW));

            googleMap.addMarker(marker);

            // Move the camera to last position with a zoom level
            if (i == 9) {
                CameraPosition cameraPosition = new CameraPosition.Builder()
                        .target(new LatLng(randomLocation[0], randomLocation[1]))
                        .zoom(15).build();

                googleMap.animateCamera(CameraUpdateFactory
                        .newCameraPosition(cameraPosition));
            }
        }

    }

    /*
     * creating random postion around a location for testing purpose only
     */
    private double[] createRandLocation(double latitude, double longitude) {

        return new double[] { latitude + ((Math.random() - 0.5) / 500),
                longitude + ((Math.random() - 0.5) / 500),
                150 + ((Math.random() - 0.5) * 10) };
    }

    @Override
    public void onLocationChanged(Location location) {

        if (null != googleMap) {
            // To get lattitude value from location object
            double latti = location.getLatitude();
            // To get longitude value from location object
            double longi = location.getLongitude();

            // To hold lattitude and longitude values
            LatLng position = new LatLng(latti, longi);

            createMarker(latti, longi);

            // Creating object to pass our current location to the map
            MarkerOptions markerOptions = new MarkerOptions();
            // To store current location in the markeroptions object
            markerOptions.position(position);

            // Zooming to our current location with zoom level 17.0f
            googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(position,
                    17f));

            // adding markeroptions class object to the map to show our current
            // location in the map with help of default marker
            googleMap.addMarker(markerOptions);
        }

    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onProviderEnabled(String provider) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onProviderDisabled(String provider) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onDestroyView() {
        // TODO Auto-generated method stub
        super.onDestroyView();

        locationManager.removeUpdates(this);

        android.app.Fragment fragment = getActivity().getFragmentManager()
                .findFragmentById(R.id.map);
        if (null != fragment) {
            android.app.FragmentTransaction ft = getActivity()
                    .getFragmentManager().beginTransaction();
            ft.remove(fragment);
            ft.commit();
        }
    }

}

এক্সএমএল

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

ফলাফলটি এরকম দেখাচ্ছে: -এখানে চিত্র বর্ণনা লিখুন

আশা করি এটি কারও সাহায্য করবে।


0

এই সমাধানে আপনার স্ট্যাটিক ভেরিয়েবল নেওয়ার দরকার নেই;

Button nextBtn;

private SupportMapFragment mMapFragment;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);

    if (mRootView != null) {
        ViewGroup parent = (ViewGroup) mRootView.getParent();
        Utility.log(0,"removeView","mRootView not NULL");
        if (parent != null) {
            Utility.log(0, "removeView", "view removeViewed");
            parent.removeAllViews();
        }
    }
    else {
        try {
            mRootView = inflater.inflate(R.layout.dummy_fragment_layout_one, container, false);//
        } catch (InflateException e) {
    /* map is already there, just return view as it is  */
            e.printStackTrace();
        }
    }

    return  mRootView;
}

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    FragmentManager fm = getChildFragmentManager();
    SupportMapFragment mapFragment = (SupportMapFragment) fm.findFragmentById(R.id.mapView);
    if (mapFragment == null) {
        mapFragment = new SupportMapFragment();
        FragmentTransaction ft = fm.beginTransaction();
        ft.add(R.id.mapView, mapFragment, "mapFragment");
        ft.commit();
        fm.executePendingTransactions();
    }
    //mapFragment.getMapAsync(this);
    nextBtn = (Button) view.findViewById(R.id.nextBtn);
    nextBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Utility.replaceSupportFragment(getActivity(),R.id.dummyFragment,dummyFragment_2.class.getSimpleName(),null,new dummyFragment_2());
        }
    });

}`

0

আমি পার্টিতে কিছুটা দেরি করে ফেলেছি তবে এই উত্তরগুলির উত্তর আমার ক্ষেত্রে আমাকে সহায়তা করেছিল helped আমি গুগল ম্যাপটি আমার খণ্ডে সাপোর্টম্যাপফ্র্যাগমেন্ট এবং প্লেসআউটোকম্পলফ্র্যাগমেন্ট হিসাবে ব্যবহার করছিলাম । সমস্ত উত্তর যেমন সমস্যাটির দিকে ইঙ্গিত করেছে যে সাপোর্টম্যাপফ্র্যাগমেন্টটি মানচিত্রটি পুনরায় তৈরি করা এবং পুনরায় চিত্রিত করা হবে B তবে খনন করার পরে আমার সমস্যাটি আসলে প্লেসআউটোকম্পল্ট ফ্রেমমেন্টের সাথে ছিল

সুতরাং সাপোর্টম্যাপফ্র্যাগমেন্ট এবং সাপোর্টম্যাপফ্র্যাগমেন্টের কারণে যারা এই সমস্যার মুখোমুখি হচ্ছেন তাদের কার্যকারী সমাধান এখানে

 //Global SupportMapFragment mapFragment;
 mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.mapFragment);
    FragmentManager fm = getChildFragmentManager();

    if (mapFragment == null) {
        mapFragment = SupportMapFragment.newInstance();
        fm.beginTransaction().replace(R.id.mapFragment, mapFragment).commit();
        fm.executePendingTransactions();
    }

    mapFragment.getMapAsync(this);

    //Global PlaceAutocompleteFragment autocompleteFragment;


    if (autocompleteFragment == null) {
        autocompleteFragment = (PlaceAutocompleteFragment) getActivity().getFragmentManager().findFragmentById(R.id.place_autoCompleteFragment);

    }

এবং অনডেট্রয়েভিউতে সাপোর্টম্যাপফ্র্যাগমেন্ট এবং সাপোর্টম্যাপফ্রেগমেন্ট সাফ করুন

@Override
public void onDestroyView() {
    super.onDestroyView();


    if (getActivity() != null) {
        Log.e("res","place dlted");
        android.app.FragmentManager fragmentManager = getActivity().getFragmentManager();
        android.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.remove(autocompleteFragment);
        fragmentTransaction.commit(); 
       //Use commitAllowingStateLoss() if getting exception 

        autocompleteFragment = null;
    }


}

0

আপনার মানচিত্রভিউ অভিভাবক বিন্যাসের জন্য একটি আইডি (অ্যান্ড্রয়েড: id = "@ + আইডি / মানচিত্র_ডায়ালগ") সেট করার চেষ্টা করুন। আমার জন্য কাজ কর.


0

গুগল প্লেসগুলির সাথে কোনও Dialogবা অন্যটি খোলার সময় এখন যে কেউ এখানে আসছেন তিনি এই ধরণের ত্রুটিটি পেয়ে Fragmentযাচ্ছেন AutocompleteSupportFragment, এই ওয়ান-লাইনারটি ব্যবহার করে দেখুন (এটি আমার পক্ষে কতটা নিরাপদ তা কিন্তু আমি জানি না):

autocompleteFragment.getFragmentManager().beginTransaction().remove(autocompleteFragment).commit();

আপনার খণ্ড খারিজ / নষ্ট করার আগে before


-1
<?xml version="1.0" encoding="utf-8"?>

  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
   android:layout_height="match_parent" >


<com.google.android.gms.maps.MapView
    android:id="@+id/mapview"
    android:layout_width="100dip"
    android:layout_height="100dip"
    android:layout_alignParentTop="true"
    android:layout_alignRight="@+id/textView1"
    android:layout_marginRight="15dp" >
</com.google.android.gms.maps.MapView>

আপনি মানচিত্রের পরিবর্তে ম্যাপভিউ অবজেক্টটি ব্যবহার করে কোনও মানচিত্র sertোকাচ্ছেন না কেন? আমি নিশ্চিত নই যে ম্যাপভিউতে কোনও সীমাবদ্ধতা রয়েছে কিনা, যদিও আমি এটি সহায়ক বলে মনে করেছি।


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