Com.google.android.gms.maps.MapFragment için başka bir parçayla yinelenen kimlik, etiket null veya üst kimlik


334

Üç sekmeli bir uygulamam var.

Her sekmenin kendi düzen .xml dosyası vardır. Main.xml dosyasının kendi harita parçası vardır. Uygulama ilk başlatıldığında görünen odur.

Sekmeler arasında geçiş yaptığım zamanlar dışında her şey iyi çalışıyor. Harita parçası sekmesine geri dönmeye çalışırsam, bu hatayı alıyorum. Diğer sekmeler arasında ve arasında geçiş yapmak gayet iyi.

Burada ne yanlış olabilir?

Bu benim ana sınıfım ve main.xml'im ve kullandığım ilgili bir sınıftır (ayrıca hata günlüğünü en altta bulacaksınız)

ana sınıf

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>

ilgili sınıf (MapFragment.java)

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

hata

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

bunu deneyin - super.onCreateView döndürün (inflater, konteyner, savedInstanceState); super.onCreateView yerine (inflater, konteyner, savedInstanceState); inflater.inflate dönüşü (R.layout.main, konteyner, yanlış);
Nik

saveInstanceState boş olmadığında size parça eklemezsiniz.
muyiou

Bu yoruma bir göz atın. Size yardımcı olabilir: stackoverflow.com/questions/15562416/…
Oleksandr

2
Lütfen kabul edilen cevabı değiştirin! Hafıza sızıntıları yaratan çok kötü bir cevap seçtiniz! Doğru cevap şudur: stackoverflow.com/a/19815266/902276
Daniele Segato

Yanıtlar:


400

Matt'in önerdiği cevap, ancak haritanın yeniden yaratılmasına ve yeniden çizilmesine neden olur, bu da her zaman arzu edilmez. Çok sayıda deneme yanılma sonrasında, benim için çalışan bir çözüm buldum:

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

İyi bir ölçü için, R.id.mapFragment (android: id = "@ + id / mapFragment" ile "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>

Umarım bu yardımcı olur, ancak herhangi bir olumsuz etkisi olmadığını garanti edemem.

Düzenleme: Uygulamadan çıkıp yeniden başlatma gibi bazı olumsuz etkiler vardı. Uygulama mutlaka tamamen kapatılmadığından (ancak arka planda uykuya daldığından), gönderdiğim önceki kod uygulamayı yeniden başlattıktan sonra başarısız olur. Kodu benim için çalışan bir şeye güncelledim, hem haritaya girip çıkıp hem de uygulamadan çıkıp yeniden başladım, try-catch bitinden çok mutlu değilim, ama yeterince iyi çalışıyor gibi görünüyor. Yığın izine baktığımda bana sadece harita parçasının FragmentManager'da olup olmadığını kontrol edebileceğimi fark ettim, try-catch bloğuna gerek yok, kod güncellendi.

Daha fazla düzenleme: Sonuçta bu try-catch'a ihtiyacınız olduğu ortaya çıktı. Sadece harita parçasını kontrol etmek, sonuçta çok iyi çalışmadığı ortaya çıktı. Blergh.


25
Bu yanlış bir cevap -1! Bir Görünüm için statik değiştirici kullanarak bir etkinlik sızdırıyorsunuz. Bu sorunun temel nedeni muhtemelen, başka bir sızdırılmış etkinliktir, çöp toplama işlemi yapılamayacağından çöp toplanamaz. Atılan bir InflateException varsa, yok edilen etkinlik bağlamı olan bir görünüm kullanıyorsunuz! Daha iyi uygulamanızda diğer bellek sızıntılarını bulmak, bu tüm sorunları çözecektir.
tomrozb

1
Bellek sızıntısını önlemek için WeakReference'ı kullanabilir miyiz?
Desmond Lua

2
Bu benim için de geçerli +1. Statik görünüm referansı kullanmak zorunda değilsiniz
Karol Żygłowicz

4
Bunu yapma !!! Bellek sızıntısına neden oluyor. Bunun tek nedeni XML'den bir parçayı başka bir parçanın içinde şişirmenizdir. Bunu yapman GEREKMEZ! ChildFragmentManager'ı kullanmalı ve parçayı onViewCreated () 'a eklemelisiniz!
Daniele Segato

1
Evet, bu gerçekten aktiviteyi sızdırır. Stackoverflow.com/a/27592123/683763 içinde çalışan bir çözüm bulundu . Fikir, SupportMapFragmentin onDestroyViewyöntemini manuel olarak kaldırmaktır .
ULazdins

277

Sorun şu ki, yapmaya çalıştığınız şey yapılmamalı. Parçaları diğer parçaların içine şişirmemelisiniz. Android dokümanlarından :

Not: Bir düzen bir <fragment> içerdiğinde bir yerleşimi parçaya şişiremezsiniz. Yuvalanmış parçalar yalnızca bir parçaya dinamik olarak eklendiğinde desteklenir.

Görevi burada sunulan hack'lerle gerçekleştirebilmenize rağmen, bunu yapmamanızı şiddetle tavsiye ederim. Başka bir parça içeren bir parça için bir düzeni şişirmeye çalıştığınızda, bu saldırıların her yeni Android işletim sisteminin yaptıklarını ele alacağından emin olmak imkansızdır.

Bir parçayı başka bir parçaya eklemenin tek Android destekli yolu, alt parça yöneticisinin yaptığı bir işlemdir.

XML düzeninizi boş bir kapsayıcıya değiştirmeniz yeterlidir (gerekirse bir kimlik ekleyin):

<?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>

Sonra Fragment onViewCreated(View view, @Nullable Bundle savedInstanceState)yönteminde:

@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
Programlı bir harita parçası oluşturma ve haritayı başlatma örnekleri için stackoverflow.com/questions/13733299/… adresine bakın .
Kristopher Johnson

1
Ayrıca , alt parça desteğindeki görünür hata için geçici çözüm için stackoverflow.com/questions/19239175/… adresine bakın .
Kristopher Johnson

XML'de tanımlı 4.3bir kullanırken bu sorunla karşılaştım SupportMapFragment. Parçayı dinamik olarak oluşturmak ve bir kapsayıcı görünümüne enjekte etmek sorunu çözdü. Bu SO cevabına bakın .
theblang

Çok yararlı bir cevap. OnCreate () ana işlevine nasıl geri çağrı yapabiliriz?
Ütopya

2
Dokümanlara göre SupportMapFragment.newInstance(); developers.google.com/maps/documentation/android-api/map
Jemshit Iskenderov

178

Ben aynı sorunu vardı ve elle kaldırarak çözmek başardı MapFragmentiçinde onDestroy()yöntemine Fragmentsınıfında. MapFragmentXML'de by ID ile çalışan ve referans veren kod :

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

MapFragmentManuel olarak kaldırmazsanız , harita görünümünü yeniden oluşturmak / göstermek için çok fazla kaynağa mal olmayacak şekilde takılır. Altta yatan MapViewsekmeler arasında geçiş yapmak için harika görünüyor , ancak parçalarda kullanıldığında bu davranış , aynı kimliğe sahip MapViewher yeni üründe bir kopya oluşturulmasına neden oluyor MapFragment. Çözüm, MapFragmentparçanın her şişirişinde alttaki haritayı manuel olarak kaldırmak ve yeniden oluşturmaktır.

Bunu başka bir cevapta da belirtmiştim [ 1 ].


Geliştirici seçeneklerindeki "Etkinlikleri tutma" özelliğiyle cihazın ana düğmesini tıkladığınızda uygulamanın kilitlenmesini sağlar.
temmuz

24
Bu çalışır, ancak ekranımı döndürürseniz, benim app bu istisna ile çöküyor: Neden: java.lang.IllegalStateException: onSaveInstanceState sonra bu eylem gerçekleştirilemez
jramoyo 15:13

1
İlgilenebilecek olanlar için, parçanın yapıcısında inital yönelimi saklayarak ve yukarıdaki işlemi yalnızca yönlendirme DEĞİLSE, çağırarak ekran döndürmenin neden olduğu istisnayı ortadan kaldırabilirsiniz. Değiştirilmişse, yinelenen kimlikle mücadele etmeye gerek yoktur, çünkü dönüşten sonra görünüm yeniden oluşturulduğunda orada değildir. Matt sakıncası yoksa cevabı düzenleyebilir ve bir kod snippet'i sağlayabilirim.
Stan

1
Hmm benim için harita parçası kaldırılmıyor. Yanlış bir şey yapmalıyım ama getActivity (). GetSupportFragmentManager (). GetFragments () çağırırsam, fragman (f) .commit çağrıldıktan sonra kalır. Neden herhangi bir fikri olan var mı? (GetFragManager'ı getSupportFragManager ile değiştirdim)
Daniel Wilson

10
commitAllowingStateLoss, IllegalStateException istisnasını önleyecektir.
Héctor Júdez Sapena

22

Bu benim cevabım:

1, aşağıdaki gibi bir düzen xml oluşturun:

<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, Fragment sınıfında, programlı bir google haritası ekleyin.

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();döner null. Neden olduğu hakkında bir fikrin var mı?
Anas Azeem

@AnasAzeem, parça oluşturmak programlı olarak sorunu tam olarak çözer, belki sizin durumunuzda çözüm için mMap almak zorunda değilsiniz.
yesildal

@AnasAzeem, başlattıktan sonra (arka planda) bir harita örneğini doğru olarak döndürecek get getMapAsync'i kullanmalısınız. Bu, Google haritaları ile çalışmanın "doğru" yoludur ve parçalarla ilgisi yoktur
Ganesh Krishnan

10
  1. @Justin Breitfeller tarafından belirtildiği gibi, @Vidar Wahlberg çözümü, Android'in gelecekteki sürümlerinde çalışmayabilecek bir hack'tir.
  2. @Vidar Wahlberg bir saldırıya neden olur, çünkü diğer çözüm "haritanın yeniden yaratılmasına ve yeniden çizilmesine neden olabilir, bu da her zaman istenmez." Harita yeniden çizimi, her seferinde yeni bir örnek oluşturmak yerine eski harita parçasını koruyarak önlenebilir.
  3. @Matt çözümü benim için çalışmıyor (IllegalStateException)
  4. @Justin Breitfeller tarafından alıntılandığı gibi, "Bir düzen bir düzen içerdiğinde parçayı şişiremezsiniz. İç içe parçalar yalnızca bir parçaya dinamik olarak eklendiğinde desteklenir."

Çözümüm:

@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
Thanks @Desmond Çözümünüz benim için kusursuz çalıştı. Hatırlamanız gereken tek şey haritayı mizanpajda oluşturmak DEĞİLDİR. Bu çözümdeki harita oluşturma koda gömülüdür, bu nedenle <fragment android: name = "com.google.android.gms.maps.SupportMapFragment"> öğesini örneğin <LinearLayout id = "@ + id / map />
kosiara - Bartosz olarak değiştirin Kosarzycki

7

SupportMapFragment nesnesini genel olarak bildirin

    private SupportMapFragment mapFragment;

OnCreateView () yönteminde kodun altına koyun

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

OnDestroyView () kodu aşağıda

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

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

Xml dosyanıza aşağıdaki kodu yazın

 <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"
    />

Kodun üstünde sorunumu çözdüm ve iyi çalışıyor



3

Başka bir çözüm:

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

Bu kadar değil, eğer sıfır değilse, yeniden başlatmanız gerekmez, üst öğeden kaldırmak gereksiz bir adımdır.


Bu benim durumum için en iyi çözümdür. Navigasyon grafiğim için iki parça kullanmanın bir sonucu olarak bu hatayı alıyordum ve bu sorunumu düzeltti.
Kennedy Kambo

Bu benim durumum için en iyi çözümdür. Navigasyon grafiğim için iki parça kullanmanın bir sonucu olarak bu hatayı alıyordum ve bu sorunumu düzeltti.
Kennedy Kambo

2

Nedenini bulmak için bugün saat kaybettim, Neyse ki bu sorun MapFragment uygulaması nedeniyle değil, ne yazık ki, iç içe fragmanlar sadece rev 11 destek kütüphanesi ile desteklendiği için bu işe yaramaz.

Uygulamamda eylem sekmesi (sekmeli modda) ve biri haritaya sahip diğeri de giriş listesi bulunan iki sekmeli (görünüm görüntüleme yok) bir etkinlik var. Tabii ki tab-fragmanlarım içinde MapFragment'i kullanmak için oldukça naif davrandım, haritaya geri döndüğümde uygulama çöktü.

(Sekme parçamın başka herhangi bir parçayı içeren herhangi bir düzeni şişirmesi durumunda da aynı sorun olurdu).

Bir seçenek de MapView'i (MapFragment yerine) bir miktar ek yük ile kullanmaktır (bkz. MapView Docs drop-in değiştirme olarak MapView , başka bir seçenek de rev. 11'den destek kitaplığını kullanmaktır, ancak daha sonra programlı bir yaklaşım kullanmaktır. iç içe fragmanlar yerleşim tarafından desteklenmediğinden veya sadece parçayı (Matt / Vidar'ın cevabında olduğu gibi) açıkça yok ederek programlı bir şekilde çalışarak, btw: MapView (seçenek 1) kullanılarak aynı etki elde edilir.

Ama aslında, her sekme gittiğimde haritayı kaybetmek istemedim, yani sadece etkinlik kapatıldığında hafızasında tutmak ve temizlemek istedim, bu yüzden sekme sırasında haritayı gizlemeye / göstermeye karar verdim, bkz. FragmentTransaction / hide


2

Hâlâ bu sorunla karşılaşanlar için, bu hatayı Sekmedeki Harita ile almadığınızdan emin olmanın en iyi yolu , Sekme için kullanılan Parçanın içine SupportMapFragmentbir yuva yerleştirmek yerine Parçayı genişletmektir SupportMapFragment.

Ben sadece üçüncü sekmesinde SupportMapFragment ViewPagerile bir FragmentPagerAdapter, kullanarak bu çalışma var .

İşte genel yapı, onCreateView()yöntemi geçersiz kılmaya gerek olmadığını ve xml düzenini şişirmeye gerek olmadığını unutmayın:

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

            }
        });

    }


}

Sonuç:

resim açıklamasını buraya girin

İlk iki sekme için kullanılan yer tutucu parçasını ve üçüncü sekme için kullanılan harita parçasını içeren, test etmek için kullandığım tam sınıf kodu:

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

Tüm cevaplara saygı duyuyorum ama bu bir liner çözüm buldum: Eğer n Sekme sayısı o zaman:

 mViewPager.setOffscreenPageLimit(n);

Örnek: Belirtildiği durumda:

 mViewPager.setOffscreenPageLimit(2);

Görüntüleme çağrı cihazı bir kuyruk uygular, böylece bu parçayı kaldırmasına izin vermek zorunda kalmazsınız. onCreateView yalnızca bir kez çağrılır.


1

Düzeni iki kez iade ediyor veya şişiriyorsunuz, sadece bir kez şişirip şişirmediğinizi kontrol edin.



0

MapFragmentDüzen dosyasında özel sınıfınıza başvurmaya mı çalışıyorsunuz ?

<?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>

Özel harita fragmanı için kod gönderebilir misiniz com.nfc.demo.MapFragment
Mina Fawzy

Kodun yazarı değilim - sadece söz konusu kodu kullandım. Hermann'a sormalısın.
JJD

0

Yalnızca Vidar Wahlberg yanıtını kullanacaksanız, diğer etkinlikleri (örneğin) açıp haritaya döndüğünüzde hata alırsınız. Ya da benim durumumda başka bir etkinlik açın ve ardından yeni etkinlikten haritayı tekrar açın (geri düğmesini kullanmadan). Ancak Vidar Wahlberg çözümünü ve Matt çözümünü birleştirdiğinizde istisnalar olmayacak.

Yerleşim

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

fragman

@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

Bu viewPager vardı ve herhangi bir parçanın kendi etiketi, yinelenen etiketleri veya aynı parça için kimlikleri izin verilmiyordu çünkü çökme oldu.


0

Ben çocuk Fragment için önceki App-Compat lib bazı hatalar olduğunu düşünüyorum. @Vidar Wahlberg'i denedim ve @ Matt'in ve benim için çalışmadılar. Appcompat kütüphanesini güncelledikten sonra kodum ekstra çaba harcamadan mükemmel çalışır.


0

Burada dikkat edilmesi gerekenler, uygulamanızın iki durumda da kötü bir şekilde çökeceğidir: -

1) Parçayı Haritalar ile tekrar kullanmak için, Haritalar'ı gösteren parçanız onDestroyView geri çağrısında başka bir parçayla değiştirildiğinde MapView Parçası kaldırılmalıdır.

aynı parçayı iki kez şişirmeye çalıştığınızda com.google.android.gms.maps.MapFragment için yinelenen kimlik, etiket null veya üst kimlik başka bir parça ile hatası .

2) İkincisi app.Fragment işlemlerini android.support.v4.app.Fragment API işlemleri ile karıştırmamalısınız. Örn. V4.app.Fragment türünü kaldırmak için android.app.FragmentTransaction kullanmayın. Bunu karıştırmak parça parçasından tekrar çarpmaya neden olur.

İşte MapView'in doğru kullanımı için örnek kod snippet'i

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

}

XML

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

Sonuç şöyle görünür: -resim açıklamasını buraya girin

Umarım birine yardım eder.


0

Bu çözümde statik değişken almanıza gerek yoktur;

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

Partiye biraz geç kaldım ama bu cevapların hiçbiri benim durumumda bana yardımcı oldu. Her iki parçamda Google haritasını SupportMapFragment ve PlaceAutocompleteFragment olarak kullanıyordum . Tüm yanıtları sorun SupportMapFragment benim sorun aslında öğrendim kazma sonra yeniden ve redrawn.But edilecek haritası olmak olmasından belirttiği gibi PlaceAutocompleteFragment

İşte SupportMapFragment ve SupportMapFragment nedeniyle bu sorunla karşılaşanlar için çalışma çözümü

 //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);

    }

OnDestroyView'da SupportMapFragment ve SupportMapFragment öğelerini temizleyin

@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

MapView üst düzeniniz için bir kimlik (android: id = "@ + id / maps_dialog") ayarlamayı deneyin. Benim için çalışıyor.


0

Şimdi buraya gelen herkes Google Rehber ile bir Dialogveya diğerini açarken bu tür bir hata alıyor , bu tek astarı deneyin (bunun ne kadar güvenli olduğunu bilmiyorum ama benim için çalışıyor):FragmentAutocompleteSupportFragment

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

parçanızı kovmadan / yok etmeden önce.


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

Neden MapFragment yerine MapView nesnesini kullanarak bir harita eklemiyorsunuz? MapView herhangi bir sınırlama olup olmadığını emin değilim, ancak yararlı buldum.


Maalesef, Google Maps API'nın kullanımdan kaldırılmış önceki sürümü olduğunu
öğrendim
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.