我创建了一个带有底页的应用程序,现在我正在尝试在其中放置一个谷歌地图片段。
我输入了所有Manifest权限和依赖项。这是我的主要活动代码:
public class MainActivity extends FragmentActivity implements OnMapReadyCallback {
Button eventListButton;
private BottomSheetBehavior mBottomsheetbehvior;
RecyclerView rv;
LinearLayoutManager llm;
Context context;
public List<Events> events;
private GoogleMap mMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
events = new ArrayList<Events>();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
//Find Button
eventListButton = (Button) findViewById(R.id.eventlistbutton);
//Find bottom sheet
android.support.v4.widget.NestedScrollView bottomsheet =
(android.support.v4.widget.NestedScrollView) findViewById(R.id.bottomsheet);
//Add bottomsheet behavior to view
mBottomsheetbehvior = BottomSheetBehavior.from(bottomsheet);
mBottomsheetbehvior.setHideable(true);
mBottomsheetbehvior.setPeekHeight(400);
mBottomsheetbehvior.setState(BottomSheetBehavior.STATE_HIDDEN);
eventListButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(mBottomsheetbehvior.getState() == BottomSheetBehavior.STATE_EXPANDED) {
mBottomsheetbehvior.setState(BottomSheetBehavior.STATE_COLLAPSED);
eventListButton.setText("Hide");
}
else if(mBottomsheetbehvior.getState() == BottomSheetBehavior.STATE_COLLAPSED) {
mBottomsheetbehvior.setState(BottomSheetBehavior.STATE_HIDDEN);
eventListButton.setText("Event List Button");
}
else if(mBottomsheetbehvior.getState() == BottomSheetBehavior.STATE_HIDDEN) {
mBottomsheetbehvior.setState(BottomSheetBehavior.STATE_EXPANDED);
eventListButton.setText("Peek");
}
}
});
//Bottomsheet callbacks
mBottomsheetbehvior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
@Override
public void onStateChanged(@NonNull View bottomSheet, int newState) {
if (newState == BottomSheetBehavior.STATE_EXPANDED) {
eventListButton.setText("Peek");
}
else if (newState == BottomSheetBehavior.STATE_COLLAPSED) {
eventListButton.setText("Hide");
}
else if (newState == BottomSheetBehavior.STATE_HIDDEN) {
eventListButton.setText("Event List Button");
}
}
@Override
public void onSlide(@NonNull View bottomSheet, float slideOffset) {
}
});
//Recyler View
rv = (RecyclerView) findViewById(R.id.rv);
rv.setHasFixedSize(true);
llm = new LinearLayoutManager(context);
//Temporary Data
String[] participants = {"Tamim","Chiharu","Azmain","Miyoshi","Steve Jobs","Michael Jackson","手塚治虫"};
//Temporary Data
events.add(new Events(1302719286,"U22 project",participants,new LatLng(37.652832,219.839478),"Saizeriya"));
events.add(new Events(1502419296,"U22 project",participants,new LatLng(32.652832,19.839478),"Hiroo"));
events.add(new Events(1901719266,"U22 project",participants,new LatLng(19.652832,39.839478),"Canada"));
events.add(new Events(1204219286,"U22 project",participants,new LatLng(100.652832,13.839478),"Tokyo Monorail"));
RVAdapter adapter = new RVAdapter(this,events);
rv.setAdapter(adapter);
rv.setLayoutManager(new LinearLayoutManager(context));
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
//Add a marker in Sydney and move the camera
LatLng school = new LatLng(-34, 151);
mMap.addMarker(new MarkerOptions().position(school).title("Sample Marker"));
mMap.moveCamera(CameraUpdateFactory.newLatLng(school));
}
}
这会导致我输入的地方出现Null Pointer Exception错误:
mapFragment.getMapAsync(this);
这是错误:
08-16 11:48:18.905 8997-8997/com.example.android.gatheraround E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.android.gatheraround, PID: 8997
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.android.gatheraround/com.example.android.gatheraround.MainActivity}: 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
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Caused by: 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
at com.example.android.gatheraround.MainActivity.onCreate(MainActivity.java:54)
at android.app.Activity.performCreate(Activity.java:5990)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
请注意我已尝试评论“异步”方法,并且地图加载完全正常。但是,它根本不动。
如果有帮助,这是我的布局文件:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/bgLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="0dp"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:paddingTop="0dp"
tools:context=".MainActivity">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/map"
android:name="com.google.android.gms.maps.MapFragment"
/>
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:text="EventList Button"
android:id="@+id/eventlistbutton"
/>
</RelativeLayout>
</ScrollView>
</RelativeLayout>
<android.support.v4.widget.NestedScrollView
android:id="@+id/bottomsheet"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="true"
android:background="@color/recyclerview_background"
app:layout_behavior="@string/bottom_sheet_behavior"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:layout_height="match_parent"
android:layout_width="match_parent"
android:id="@+id/rv"
android:layout_marginLeft="@dimen/recyclerviewhorizontalpadding"
android:layout_marginRight="@dimen/recyclerviewhorizontalpadding"
>
</android.support.v7.widget.RecyclerView>
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>