[英]navigationView setText fatal exception on a null object reference
[英]NavigationView raises null object reference exception
我在 Android Studio 中做了一個 DrawerLayout,其中包含一個谷歌地圖片段、一個 NavigationView 和一個 FrameLayout。
我的抽屜布局xml:
<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:map="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.navigation.NavigationView
android:id="@+id/navigation"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
map:menu="@menu/nav_items"/>
<FrameLayout
android:id="@+id/frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/map"
android:name="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".app" />
<Button
android:id="@+id/pop_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_margin="10dp"
android:background="@drawable/button_back"
android:text="Pozovi"
map:layout_constraintBottom_toBottomOf="parent"
map:layout_constraintEnd_toEndOf="parent"
map:layout_constraintStart_toStartOf="parent"
map:layout_constraintTop_toTopOf="@+id/map"
map:layout_constraintVertical_bias="0.9" />
<ImageButton
android:onClick="open_drawer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_menu"
map:layout_constraintBottom_toBottomOf="parent"
map:layout_constraintEnd_toEndOf="parent"
map:layout_constraintStart_toStartOf="parent"
map:layout_constraintTop_toTopOf="parent"
map:layout_constraintVertical_bias="0.01"
map:layout_constraintHorizontal_bias="0.01"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.drawerlayout.widget.DrawerLayout>
在我的 java 活動代碼中,我添加了一個 onNavigationItemSelected 偵聽器:
dLayout = findViewById(R.id.drawer_layout);
navView = (NavigationView) findViewById(R.id.navigation);
navView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
Toast.makeText(getApplicationContext(),"Hello",Toast.LENGTH_SHORT).show();
return true;
}
});
問題是這會引發以下錯誤:
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.material.navigation.NavigationView.setNavigationItemSelectedListener(com.google.android.material.navigation.NavigationView$OnNavigationItemSelectedListener)' on a null object reference
這是我的完整 Java 類代碼:
package com.example.soferapp;
import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.text.Editable;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.Toast;
import com.example.soferapp.databinding.ActivityAppBinding;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptor;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.material.bottomsheet.BottomSheetDialog;
import com.google.android.material.navigation.NavigationView;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import java.util.ArrayList;
import java.util.List;
public class app extends FragmentActivity implements OnMapReadyCallback{
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference driver_data = database.getReference("Data").child("Drivers");
DatabaseReference user_data = database.getReference("Data").child("Users");
private GoogleMap mMap;
private ActivityAppBinding binding;
LocationManager locationManager;
LocationListener locationListener;
int permission_id = 1;
Button pop_button;
int num = 0;
private DrawerLayout mDrawerLayout;
List<String> list = new ArrayList<>();
EditText phone_number_input;
DrawerLayout dLayout;
LatLng bih_location = new LatLng(43.86073594535343, 17.771002261242077);
NavigationView navView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
dLayout = findViewById(R.id.drawer_layout);
navView = (NavigationView) findViewById(R.id.navigation);
navView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
Toast.makeText(getApplicationContext(),"Hello",Toast.LENGTH_SHORT).show();
return true;
}
});
binding = ActivityAppBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
pop_button = findViewById(R.id.pop_button);
pop_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(app.this,
R.style.BottomSheetDialogTheme);
View bottomSheetView = LayoutInflater.from(getApplicationContext()).inflate(R.layout.bottom_window, (LinearLayout) findViewById(R.id.bottom_containter));
phone_number_input = bottomSheetView.findViewById(R.id.phone_number);
bottomSheetView.findViewById(R.id.call).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String phone_number = phone_number_input.getText().toString();
String key = user_data.push().getKey();
user_data.child(key).child("Phone_number").setValue(phone_number);
user_data.child(key).child("Location").setValue("My coordinates");
user_data.child(key).child("Key").setValue(key);
Toast.makeText(app.this, "Poslat je zahtjev za prevoz", Toast.LENGTH_SHORT).show();
bottomSheetDialog.dismiss();
}
});
bottomSheetDialog.setContentView(bottomSheetView);
bottomSheetDialog.show();
}
});
}
@Override
public void onMapReady(GoogleMap googleMap) {
googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(bih_location, 7));
driver_data.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
googleMap.clear();
list.clear();
for(DataSnapshot ds : dataSnapshot.getChildren()) {
String driver_coordinates = ds.getValue(String.class);
list.add(driver_coordinates);
}
for(int i = 0; i < list.size(); i++){
String driver_location = list.get(i);
Double lat = Double.parseDouble(driver_location.split(",")[0]);
Double lon = Double.parseDouble(driver_location.split(",")[1]);
mMap.addMarker(new MarkerOptions().title("Vozač").position(new LatLng(lat, lon)).icon(BitmapDescriptorFactory.fromResource(R.drawable.car_icon)));
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
});
mMap = googleMap;
enableMyLocation();
}
private void enableMyLocation() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED) {
if (mMap != null) {
mMap.setMyLocationEnabled(true);
//View locationButton = ((View) findViewById(Integer.parseInt("1")).getParent()).findViewById(Integer.parseInt("2"));
//locationButton.setBackgroundColor(Color.parseColor("#20262b"));
}
} else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, permission_id);
enableMyLocation();
}
}
public void open_drawer(View view){
//dLayout.openDrawer(Gravity.LEFT);
}
}
錯誤在第 78 行出現。我嘗試做很多事情來解決這個問題,但沒有任何效果。
在找到任何視圖之前,您應該先 setContentView。 所以像這樣的順序:
binding = ActivityAppBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
dLayout = findViewById(R.id.drawer_layout);
navView = (NavigationView) findViewById(R.id.navigation);
navView.setNavigationItemSelectedListener(
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.