2013-12-01 3 views
3

Я пытаюсь создать приложение для Android, которое имеет одну активность и несколько фрагментов. Каждый фрагмент будет занимать весь экран, когда он находится в поле зрения, и при замене транзакции он должен быть переключен на другой фрагмент.android map in fragment

<FrameLayout 
    android:id="@+id/content_frame" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

Это контейнер для фрагментов. Проблема в том, что фрагмент, который я хочу использовать, - это GoogleMap. Это мой код для фрагмента карты:

public class Map extends Fragment{ 
private final static String TAG = "MAP Fragment"; 
public GoogleMap googleMap = null; 

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

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.map_fragment, null); 
    return view; 
} 

private void setUpMapIfNeeded() 
{ 
    if(googleMap == null) 
    { 
     googleMap = ((MapFragment) getActivity().getFragmentManager().findFragmentById(R.id.map)).getMap(); 
     if(googleMap != null) 
     { 
      GoogleMapOptions options = new GoogleMapOptions(); 
      options.mapType(GoogleMap.MAP_TYPE_NORMAL) 
       .camera(new CameraPosition(new LatLng(25f, 47f), 13f, 0f, 0f)); 
     } 
     else 
     { 
      Log.d(TAG, "googleMap is null !!!!!!!!!!!!!!!"); 
     } 
    } 
} 

}

и это расположение:

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

И в Основной вид деятельности:

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
Map test = new Map(); 
getSupportFragmentManager().beginTransaction() 
      .add(R.id.content_frame, test) 
      .commit(); 
} 

Я получаю нулевой указатель исключение: (я считаю, что он не может найти R.id.map)

googleMap = ((MapFragment) getActivity().getFragmentManager() 
.findFragmentById(R.id.map)).getMap(); 

Если я не использую «getActivity()». он говорит, что он не может отбрасывать из фрагмента в MapFragment.

Мне нужна "googleMap" для создания маркеров на карте.

Когда я делаю то же приложение, но без фрагментов (моя основная деятельность дублирует карту, а у меня нет других фрагментов), когда-то работает отлично.

Я нашел похожие темы: Google Maps API v2 Custom MapFragment + SimpleFragment и error using maps in fragment. Но если я расширяю FragmentActivity или SupportMapFragment, я не могу заменить фрагмент другим, используя транзакции.

Заключение: Я хотел бы, что, когда происходит действие (щелчок или что-то), я только заменить fragmens, как это:

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
transaction.replace(R.id.fragment_container, newFragment); 

Что я делаю неправильно? Или я должен использовать другой подход к проблеме?

(P.S. Я realtively новый для андроида)

ответ

1

Проблема заключается в том, что я пытаюсь изменить элемент карты, прежде чем он был показан setUpMapIfNeeded() вызывается в onCreate() (вид надувается только в onCreateView()).

Если я переведу вызов setUpMapIfNeeded() в onResume(), все работает, потому что тогда вид завышен, и он может использовать карту и изменить ее.

This is where I found the answer