2016-12-31 4 views
0

Я хотел бы построить Fragment, который состоит из полноэкранной карты, наложенной на другие виды (A ViewPager, EditText и т. П.). Я думал о двух различных вариантах:Создание пользовательского фрагмента с полной экранной картиной

  1. Создать Fragment с MapView вблизи корня макета и установите его в match_parent, а затем использовать другие View «S, как обычно.
  2. Подкласс MapFragment.

Я подклассы MapFragment:

public class ListMapFragment extends MapFragment { 

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

     return super.onCreateView(inflater, container, savedInstanceState); 
    } 
} 

Отображение этот фрагмент работает в нормальном режиме и карта занимает весь фрагмент. Тем не менее, я хотел бы отображать различные виды, как описано выше по карте. Если я пытаюсь надуть и возвратить представление (как вы бы с нормальным Fragment) путем вместо возвращения зрения, один NPE происходит:

public class ListMapFragment extends MapFragment { 

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

     View view = inflater.inflate(R.layout.fragment_list_map, container, false); 
     return view; 
    } 
} 

Вызванный: java.lang.NullPointerException: попытка вызвать интерфейс пустота maps.ad.yv() 'метод на нулевой ссылке на объект

Если я пытаюсь вызвать метод надставок перед возвращением вида, расположение загружается, но карта не является:

public class ListMapFragment extends MapFragment { 

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

     View view = inflater.inflate(R.layout.fragment_list_map, container, false); 

     super.onCreateView(inflater, container, savedInstanceState); 

     return view; 
    } 

Из двух вариантов один предпочтительнее другого? И если # 2 является предпочтительным, что не так с вышеуказанным кодом?

ответ

1

Если вы на самом деле не модифицируете какие-либо функции MapFragment, вы не должны извлекать из него. Просто создайте фрагмент с FrameLayout и MapView как match_parent и добавьте его в него.

А также то, что не так с вышеуказанным кодом. Когда вы выходите из MapFragment и переопределяете его методы, некоторые из его инициализаций не происходят, и в результате вы получаете NPE.

0

Если я пытаюсь вызвать метод надставок перед возвращением вид, расположение загружается, но карта не является:

Это путь. Но вам также нужно загрузить карту.

public class MyMapFragment extends SupportMapFragment implements OnMapReadyCallback { 
    // extends SupportMapFragment, but MapFragment should work as well 

    View rootView; 
    private MapView mapView; 

    public MyMapFragment() {} 

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

     super.onCreateView(inflater, container, savedInstanceState); 

     rootView = inflater.inflate(R.layout.fragment_map, container, false); 

     mapView = (MapView) rootView.findViewById(R.id.map); 
     mapView.onCreate(savedInstanceState); 
     mapView.onResume(); 
     mapView.getMapAsync(this);//when you already implement OnMapReadyCallback in your fragment 

     return rootView; 
    } 

    @Override 
    public void onMapReady(GoogleMap map) { 
     mainActivity.googleMap = map; 
     // play with your map 
    } 
} 

XML fragment_map.xml

<com.google.android.gms.maps.MapView 
    android:id="@+id/map" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_alignParentTop="true" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" />