2016-03-15 4 views
0

В моем приложении я использую навигационный ящик с вкладками салфетки (после this), и внутри одной из этих вкладок я хочу использовать карты Google. Я получаю эту ошибку:Google Maps v2 внутри фрагмента return void

java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.gms.maps.SupportMapFragment.getMapAsync(com.google.android.gms.maps.OnMapReadyCallback)' on a null object reference 

Я искал и обнаружил, что я могу назвать getMapAsync() в главном потоке. Однако почти все решения, с которыми я столкнулся, - это использование устаревших методов. Как я могу инициализировать карту, чтобы избежать нулевого исключения, и только вызывать ее на этой вкладке?

My Tab Фрагмент

public class PrimaryFragment extends Fragment implements OnMapReadyCallback { 

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

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    SupportMapFragment supportMapFragment = ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map)); 
    supportMapFragment.getMapAsync(this); 
} 

@Override 
public void onMapReady(GoogleMap googleMap) { 
    //toDO 
} 

}

Вкладка фрагмент XML

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

<fragment android:id="@+id/map" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    class="com.google.android.gms.maps.SupportMapFragment"/> 

</FrameLayout> 
+0

[Проверьте эту ссылку SO] (https://stackoverflow.com/a/32004257/2715073) может работать для вас. – Pankaj

ответ

0

Вы можете заменить эту строку -

SupportMapFragment supportMapFragment = ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map)); 

к этому -

SupportMapFragment supportMapFragment = ((SupportMapFragment) view.getChildFragmentManager().findFragmentById(R.id.map)); 

Надеется, что это помогает!

+0

Я не могу распознать getFragmentManager, если я его заменил. Также я пытаюсь использовать supportFragmentManager, поэтому он будет работать на более ранних версиях Android. –

+0

@ArturGaldino - Вы пытались добавить 'view.getChildFragmentManager()'? –

+0

Да, если я это сделаю, он говорит, что не может решить 'getChildFragmentManager()' –

0

Фрагмент карты действует на Lollipop, вам может понадобиться это вместо этого.

SupportMapFragment supportMapFragment; 
if (Build.VERSION.SDK_INT < 21) { 
    supportMapFragment = (SupportMapFragment) getActivity() 
     .getSupportFragmentManager().findFragmentById(R.id.map); 
} else { 
    supportMapFragment = (SupportMapFragment) getActivity() 
     .getChildFragmentManager().findFragmentById(R.id.map); 
} 
supportMapFragment.getMapAsync(this); 

Надеюсь, это сработает для вас.

Смежные вопросы