почему объект становится нулевым после передачи намерения? - PullRequest
0 голосов
/ 01 мая 2018

После нажатия на имя клиента место его / ее необходимо пометить маркером на карте Google. Поскольку я отображаю данные клиента во всплывающем окне, широта и долгота клиента передаются из класса всплывающего окна в класс действия карты как объект через намерения. При получении этого в карте activity.java он становится нулевым и выдает исключение нулевого указателя.

мой код для класса всплывающих окон (CustomerPupUp.java):

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_customer_pop_up);

    DisplayMetrics dm = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(dm);

    int width = dm.widthPixels;
    int height = dm.heightPixels;

    getWindow().setLayout((int)(width),(int)(height*.7));

    listView = (ListView)findViewById(R.id.custListVw);
    database = FirebaseDatabase.getInstance();
    reference = database.getReference("Customers");

    list = new ArrayList<>();
    adapter = new ArrayAdapter<String>(this, R.layout.activity_cust_layout,R.id.cus, list);

    customer = new AddCustomer();
    reference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for(DataSnapshot ds: dataSnapshot.getChildren() )
            {
                customer = ds.getValue(AddCustomer.class);
                Log.d("CustomerPopUp", "onDataChange: " + customer.getLat());
                list.add(customer.getFname().toString() + " " + customer.getLname().toString()  );
                customerList.add(customer);

            }
            listView.setAdapter(adapter);
            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    Intent intent = new Intent(CustomerPopUp.this, MapsActivity.class);
                    intent.putExtra("CustomerData", customerList.get(position));
                    startActivity(intent);
                }
            });
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

следующий фрагмент кода показывает, как я получаю объект через намерения в MapsActivity.java

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_maps);

    try {
        database = FirebaseDatabase.getInstance();
        reference = database.getReference("Customers");

        customer= (AddCustomer) getIntent().getSerializableExtra("CustomerData");

        mMap.addMarker(new MarkerOptions().position(new LatLng(customer.getLat(), customer.getLng())).title(customer.getFname() + customer.getLname()));

    }catch (NullPointerException ex)
    {
        Log.d(TAG, "onCreate: " + ex.getMessage());
    }

    search = (EditText)findViewById(R.id.SearchText);
    gps =(ImageView) findViewById(R.id.GpsBtn);
    cust = (ImageView)findViewById(R.id.CusBtn);

    isServiceFine();

    getLocationPermission();

    cust.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(MapsActivity.this, CustomerPopUp.class);
            startActivity(intent);
        }
    });
}

следующий класс AddCustomer

public class AddCustomer implements Serializable {

private String fname;
private String lname;
private String email;
private String pass;
private String confPass;
private int num;
Double lat;
Double lng;


AddCustomer()
{

}

public AddCustomer(String FName, String LName, String EMail, String PWD, String CONFPWD, int NUM, Double latitude, Double longtitude)
{
    this.fname = FName;
    this.lname = LName;
    this.email = EMail;
    this.pass = PWD;
    this.confPass = CONFPWD;
    this.num = NUM;
    this.lat = latitude;
    this.lng = longtitude;

}

public String getFname() {
    return fname;
}

public void setFname(String fname) {
    this.fname = fname;
}

public String getLname() {
    return lname;
}

public void setLname(String lname) {
    this.lname = lname;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public String getPass() {
    return pass;
}

public void setPass(String pass) {
    this.pass = pass;
}

public String getConfPass() {
    return confPass;
}

public void setConfPass(String confPass) {
    this.confPass = confPass;
}

public int getNum() {
    return num;
}

public void setNum(int num) {
    this.num = num;
}

public Double getLat() {
    return lat;
}

public void setLat(Double lat) {
    this.lat = lat;
}

public Double getLng() {
    return lng;
}

public void setLng(Double lng) {
    this.lng = lng;
}

}

Пожалуйста, помогите мне решить эту проблему.

Ответы [ 3 ]

0 голосов
/ 01 мая 2018

mMap.addMarker (new MarkerOptions (). Position (new) LatLng (customer.getLat (), customer.getLng ())). title (customer.getFname () + customer.getLname ()));

Вот в чем ваша проблема. Вместо использования анонимного объекта объявите переменные класса MarkerOptions и LatLng и используйте их следующим образом:

public class Foo extends FragmentActivity implements OnMapReadyCallback {

    private MarkerOptions mrkOpt = new MarkerOptions();
    private LatLng lalg;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);

        try {
            database = FirebaseDatabase.getInstance();
            reference = database.getReference("Customers");

            customer= (AddCustomer) getIntent().getSerializableExtra("CustomerData");

            lalg = new LatLng(customer.getLat(), customer.getLng());
            mrkOpt.position(lalg);
            mrkOpt.title(customer.getFname() + customer.getLname())

            mMap.addMarker(mrkOpt);

        }catch (NullPointerException ex)
        {
            Log.d(TAG, "onCreate: " + ex.getMessage());
        }

        search = (EditText)findViewById(R.id.SearchText);
        gps =(ImageView) findViewById(R.id.GpsBtn);
        cust = (ImageView)findViewById(R.id.CusBtn);

        isServiceFine();

        getLocationPermission();

        cust.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MapsActivity.this, CustomerPopUp.class);
                startActivity(intent);
            }
        });
    }
}
0 голосов
/ 02 мая 2018

Можете ли вы попробовать это? Удалите setAdapter и onItemClickListener внутри onDataChange и установите его на onCreate .. затем на onDataChange проверьте, не установлен ли адаптер в ноль, а если нет, попробуйте notifyDataSetChanged

Я не знаю, сработает ли это, но я надеюсь, что вы получите картину. Я думаю, что возможная проблема в том, что вы не передаете никаких данных, и это является причиной исключения Null.

     protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_customer_pop_up);

        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);

        int width = dm.widthPixels;
        int height = dm.heightPixels;

        getWindow().setLayout((int)(width),(int)(height*.7));

        listView = (ListView)findViewById(R.id.custListVw);
        database = FirebaseDatabase.getInstance();
        reference = database.getReference("Customers");

        list = new ArrayList<>();
        adapter = new ArrayAdapter<String>(this, R.layout.activity_cust_layout,R.id.cus, list);

        listView.setAdapter(adapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                    @Override
                    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                        if(customerList.size() != 0) {
                           Intent intent = new Intent(CustomerPopUp.this, MapsActivity.class);
                           intent.putExtra("CustomerData", customerList.get(position));
                           startActivity(intent);
                        }
                    }
                });

        customer = new AddCustomer();
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for(DataSnapshot ds: dataSnapshot.getChildren() )
                {
                    customer = ds.getValue(AddCustomer.class);
                    Log.d("CustomerPopUp", "onDataChange: " + customer.getLat());
                    list.add(customer.getFname().toString() + " " + customer.getLname().toString()  );
                    customerList.add(customer);

                    if(adapter != null)
                        adapter.notifyDataSetChanged();

                }

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }
0 голосов
/ 01 мая 2018

Вы можете передавать только Parcelable или Serializable объекты через Intent. В этом случае с вашим пользовательским объектом вам нужно заставить его реализовать Parcelable или Serializable.

Я рекомендую использовать http://www.parcelabler.com/ для простой генерации кода.

См .: Как я могу сделать свои пользовательские объекты Parcelable?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...