3

Я хочу иметь MapView во фрагменте. Кажется простым ... все равно я этого не понимаю!MapFragment в ViewPager NullPointer: 'void maps.ad.y.v()' на ссылке нулевого объекта

Я получаю эту ошибку при запуске приложения:

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

у меня есть деятельность с ViewPager: MainActivity

public class MainActivity extends AppCompatActivity { 

    private SectionsPagerAdapter mSectionsPagerAdapter; 
    private ViewPager mViewPager; 

    //...onCreate(), etc 

    public class SectionsPagerAdapter extends FragmentPagerAdapter { 
    //... 
    @Override 
    public Fragment getItem(int position) { 
     if (position == 0) { 

     return ClassicFragment.newInstance(position + 1); 
     // no problem with this one 

     } else if (position == 1) { 

     return MyMapFragment.newInstance(position + 1); 
     // here is my problem 

     } 
    } 
    } 
} 

и 2 фрагмента. (Один простой, и один с картой) Обломок мне не удается сделать правильно: MyMapFragment

public class MyMapFragment extends SupportMapFragment implements OnMapReadyCallback { 

    View rootView; 
    private MapView mapView; 
    private GoogleMap googleMap; 

    public MyMapFragment() { 
    } 

    public static MyMapFragment newInstance(int sectionNumber) { 
     MyMapFragment fragment = new MyMapFragment(); 
     return fragment; 
    } 

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

    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     mapView = (MapView) rootView.findViewById(R.id.map); 
     mapView.onCreate(savedInstanceState); 
     mapView.onResume(); 
     mapView.getMapAsync(this);//when you already implement OnMapReadyCallback in your fragment 
    } 

    @Override 
    public void onMapReady(GoogleMap map) { 
     googleMap = map; 
    } 
} 

Наконец, вот XML (fragment_map.xml) для MyMapFragment.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

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

</LinearLayout> 

Любая идея, что я делаю неправильно?

+0

http://stackoverflow.com/a/35496677/1584654 – GVillani82

+0

@ GVillani82 Я попробовать это решение, но получил точно такую ​​же ошибку :( – Fundhor

+0

я предложил бы использовать MapView вместо двойных вложенности фрагментов. Это может а также непреднамеренно решить вашу проблему. – Orbit

ответ

3

Я нашел 2 решения:

Решение 1:

Изменение Опорная Матрица до Фрагмент.

Решение 2: (Я выбрал этот)

Добавить этот вызов в MyMapFragment.

super.onCreateView(inflater, container, savedInstanceState); 
+0

Второй работал для меня. Получал nullpointer на maps.ad.yv() –

1

Надеюсь, это поможет вам. Взглянуть.

public class MyActivity extends AppCompactActivity { 


private TabLayout tabLayout; 
private ViewPager viewPager; 
Toolbar mToolBar; 
FontIcon backBtnToolbar, nextBtnToolbar; 
RobotoRegularTextView titleToolbar; 
private PopupWindow settingPopUp; 
private View popUpView; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.hotspot_tabs); 





    viewPager = (ViewPager) findViewById(R.id.viewpager); 
    setupViewPager(viewPager); 

    tabLayout = (TabLayout) findViewById(R.id.tabs); 
    tabLayout.setupWithViewPager(viewPager); 
    initToolbar(); 
    initPopUpView(); 
} 

private void setupViewPager(ViewPager viewPager) { 
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
    adapter.addFragment(new MapFragment(), "Map"); 
    adapter.addFragment(new Map1Fragment(), "Map1"); 
    adapter.addFragment(new Map2Fragment(), "Map2"); 
    viewPager.setAdapter(adapter); 
} 

class ViewPagerAdapter extends FragmentPagerAdapter { 
    private final List<Fragment> mFragmentList = new ArrayList<>(); 
    private final List<String> mFragmentTitleList = new ArrayList<>(); 

    public ViewPagerAdapter(FragmentManager manager) { 
     super(manager); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return mFragmentList.get(position); 
    } 

    @Override 
    public int getCount() { 
     return mFragmentList.size(); 
    } 

    public void addFragment(Fragment fragment, String title) { 
     mFragmentList.add(fragment); 
     mFragmentTitleList.add(title); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return mFragmentTitleList.get(position); 
    } 
} 

}

И использовать MapFragment в

public class MapFragment extends Fragment 
    { 
MapView mapView; 
GoogleMap mMap; 

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

} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // inflat and return the layout 

    View v = inflater.inflate(R.layout.map_fragment_layout, container, 
      false); 

    switch (GooglePlayServicesUtil.isGooglePlayServicesAvailable(getActivity())) { 
     case ConnectionResult.SUCCESS: 
      Toast.makeText(getActivity(), "SUCCESS", Toast.LENGTH_SHORT).show(); 
      mapView = (MapView) v.findViewById(R.id.map); 
      mapView.onCreate(savedInstanceState); 

      if (mapView != null) { 
       mMap = mapView.getMap(); 
       mMap.getUiSettings().setMyLocationButtonEnabled(true); 
       mMap.animateCamera(CameraUpdateFactory.zoomTo(17.0f)); 



      } 
      break; 
     case ConnectionResult.SERVICE_MISSING: 
      Toast.makeText(getActivity(), "SERVICE MISSING", Toast.LENGTH_SHORT).show(); 
      break; 
     case ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED: 
      Toast.makeText(getActivity(), "UPDATE REQUIRED", Toast.LENGTH_SHORT).show(); 
      break; 
     default: 
      Toast.makeText(getActivity(), GooglePlayServicesUtil.isGooglePlayServicesAvailable(getActivity()), Toast.LENGTH_SHORT).show(); 
    } 



    return v; 
} 

}

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