Как использовать MapFragment в API Fragment Here Map - PullRequest
0 голосов
/ 18 сентября 2018

В моем приложении есть 4 вкладки для используемых ViewPager , и в одной из них я хочу отобразить ЗДЕСЬ КАРТЫ . Мне удалось заставить карту работать идеально в Activity, но в Fragment Class, когда я пытаюсь преобразовать представление Fragment в MapFragment, выдается ошибка.

Вот мой пример XML-кода

<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="vertical"
  android:background="@android:color/transparent">
<!-- Map Fragment embedded with the map object -->
  <fragment
    android:id="@+id/mapfragment"
    class="com.here.android.mpa.mapping.MapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"  />
</LinearLayout>

Ниже моего образца кода фрагмента

public class CurrentLocationFragment extends Fragment {
// map embedded in the map fragment
private MapFragment mapFragment = null;
private Map map = null;
private static MapRoute mapRoute1;
private String locationAddress = "";
private Double latitude  = 18.496252;
private Double langitude = 73.802118;
private static View view;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    if (view != null) {
        ViewGroup parent = (ViewGroup) view.getParent();
        if (parent != null)
            parent.removeView(view);
    }
    try {
        view = inflater.inflate(R.layout.fragment_current_location, container, false);
    } catch (InflateException e) {  
        e.printStackTrace();
    }
    return view; 
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
     initialize();
    //displayMap();

}

 private void initialize() {

    // Search for the map fragment to finish setup by calling init().
   mapFragment = (MapFragment)   getActivity().getFragmentManager().findFragmentById(R.id.mapfragment);
   mapFragment.init(new OnEngineInitListener() {
        @Override
        public void onEngineInitializationCompleted(OnEngineInitListener.Error error) {
            if (error == OnEngineInitListener.Error.NONE) {
                map = null;
                map = mapFragment.getMap(); 
                // Set the map center to the Vancouver region (no animation)
                map.setCenter(new GeoCoordinate(latitude, langitude, 0.0),
                        Map.Animation.NONE); 
                map.getPositionIndicator().setVisible(true);
                try {
                    Image img_current_location = new Image();
                    img_current_location.setImageResource(R.drawable.marker);
                    map.getPositionIndicator().setMarker(img_current_location);

                } catch (IOException e) {
                    e.printStackTrace();
                } 
            } else {
                Log.e("HEREMAP", "Cannot initialize MapFragment (" + error + ")");
            }
        }
    });
}
@Override
public void onDestroyView() {
    super.onDestroyView();
    try{
        if (mapFragment != null)
            getActivity().getFragmentManager().beginTransaction().remove(mapFragment).commit();
    }catch (Exception e){
        e.printStackTrace();
    }

  }
}

Когда мы снова обращаемся к Карте, получаем InflateException при создании Карты, как показано ниже.

 W/System.err: android.view.InflateException: Binary XML file line #9: Binary XML file line #9: Error inflating class fragment
Caused by: android.view.InflateException: Binary XML file line #9: Error inflating class fragment
Caused by: java.lang.IllegalArgumentException: Binary XML file line #9: Duplicate id 0x7f0a010b, tag null, or parent id 0xffffffff with another fragment for com.here.android.mpa.mapping.MapFragment

Как использовать ЗДЕСЬ Карта во Фрагменте.

Заранее спасибо !!

1 Ответ

0 голосов
/ 18 сентября 2018

Ответ, который Мэтт предлагает, работает, но он заставляет карту пересоздать и перерисовать, что не всегда желательно.После большого количества проб и ошибок я нашел решение, которое работает для меня:

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) с R.id.mapFragment (android: id = "@ + id / mapFragment"):

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