.child() 在尝试使用 intent 获取字符串时未设置

.child() is not getting set when trying to use intent to Get String

我正在尝试从 firebase 检索数据,为此我试图在代码中设置地址。我必须为数据库位置提供一个字符串值,然后将其传递给下一个 activity 并使用该字符串作为地址。但是,代码中未设置地址,因此将地图上的位置设置为 0,0 (字符串设置在 MAINACTIVITY.JAVA 中并通过意图发送)

我试过直接在代码中设置 firebase 地址,它成功了。仅当我试图有意传递它时,它才停止设置 Firebase 地址

MainActivity.java

此处设置字符串值

package com.manavchordia.aplparent;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;


public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private
    RadioGroup route;
    public static final String ARG_FROM_MAIN = "arg";
    private FirebaseAuth mAuth;
    private FirebaseDatabase mDatabase = FirebaseDatabase.getInstance();
    private DatabaseReference mDatabaseReference = mDatabase.getReference().child("Locations");
    public String someVariable;
    TextView numberbs;
    Button getLocationBtn;
    private Button btnSignOut;
    Button busb1;
    Button busb2;



    Button busb3;
    Button busb4;
    Button busb5;
    Button busb6;
    Button busb7;
    Button busb8;
    Button busb9;
    Button busb10;
    Button busb11;
    Button busb12;
    Button busb13;
    Button busb14;
    Button busb15;
    Button busb16;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        numberbs = findViewById(R.id.busnotext);
        btnSignOut = findViewById(R.id.signoutbtn);
        getLocationBtn = findViewById(R.id.getLocationBtn);


        numberbs = findViewById(R.id.busnotext);
        busb1 = findViewById(R.id.busbtn1);
        busb2 = findViewById(R.id.busbtn2);
        busb3 = findViewById(R.id.busbtn3);
        busb4 = findViewById(R.id.busbtn4);
        busb5 = findViewById(R.id.busbtn5);
        busb6 = findViewById(R.id.busbtn6);
        busb7 = findViewById(R.id.busbtn7);
        busb8 = findViewById(R.id.bustbtn8);
        busb9 = findViewById(R.id.busbtn9);
        busb10 = findViewById(R.id.busbtn10);
        busb11 = findViewById(R.id.busbtn11);
        busb12 = findViewById(R.id.busbtn12);
        busb13 = findViewById(R.id.busbtn13);
        busb14 = findViewById(R.id.busbtn14);
        busb15 = findViewById(R.id.bustbtn15);
        busb16 = findViewById(R.id.busbtn16);

        busb1.setOnClickListener(this);
        busb2.setOnClickListener(this);
        busb3.setOnClickListener(this);
        busb4.setOnClickListener(this);
        busb5.setOnClickListener(this);
        busb6.setOnClickListener(this);
        busb7.setOnClickListener(this);
        busb8.setOnClickListener(this);
        busb9.setOnClickListener(this);
        busb10.setOnClickListener(this);
        busb11.setOnClickListener(this);
        busb12.setOnClickListener(this);
        busb13.setOnClickListener(this);
        busb14.setOnClickListener(this);
        busb15.setOnClickListener(this);
        busb16.setOnClickListener(this);

        getLocationBtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                //startService(new Intent(this, MyService.class));
                Intent intent = new Intent(MainActivity.this, MapsActivity.class);
                Bundle bundle = new Bundle();
                bundle.putString("message", someVariable);
                intent.putExtras(bundle);
                startActivity(intent);
            }
        });

/**
        Intent intent = new Intent(MainActivity.this, MapsActivity.class);
        intent.putExtra("Ref", someVariable);
        startActivity(intent);
 */
    }


    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.busbtn1:
               someVariable ="BUS1";
                numberbs.setText("Selected: BUS 1");
                mDatabaseReference = mDatabase.getReference().child("Locations").child("BUS1");
                break;
            case R.id.busbtn2:
                numberbs.setText("Selected: BUS 2");
                someVariable ="BUS2";
                mDatabaseReference = mDatabase.getReference().child("Locations").child("BUS2");
                break;
            case R.id.busbtn3:
                numberbs.setText("Selected: BUS 3");
                someVariable ="BUS3";
                mDatabaseReference = mDatabase.getReference().child("Locations").child("BUS3");
                break;
            case R.id.busbtn4:
                numberbs.setText("Selected: BUS 4");
                someVariable ="BUS4";
                mDatabaseReference = mDatabase.getReference().child("Locations").child("BUS4");
                break;
            case R.id.busbtn5:
                numberbs.setText("Selected: BUS 5");
                someVariable ="BUS5";
                mDatabaseReference = mDatabase.getReference().child("Locations").child("BUS5");
                break;
            case R.id.busbtn6:
                numberbs.setText("Selected: BUS 6");
                someVariable ="BUS6";
                mDatabaseReference = mDatabase.getReference().child("Locations").child("BUS6");
                break;
            case R.id.busbtn7:
                numberbs.setText("Selected: BUS 7");
                someVariable ="BUS7";
                mDatabaseReference = mDatabase.getReference().child("Locations").child("BUS7");
                break;
            case R.id.bustbtn8:
                numberbs.setText("Selected: BUS 8");
                someVariable ="BUS8";
                mDatabaseReference = mDatabase.getReference().child("Locations").child("BUS8");
                break;
            case R.id.busbtn9:
                numberbs.setText("Selected: BUS 9");
                someVariable ="BUS9";
                mDatabaseReference = mDatabase.getReference().child("Locations").child("BUS9");
                break;
            case R.id.busbtn10:
                numberbs.setText("Selected: BUS 10");
                someVariable ="BUS10";
                mDatabaseReference = mDatabase.getReference().child("Locations").child("BUS10");
                break;
            case R.id.busbtn11:
                numberbs.setText("Selected: BUS 11");
                someVariable ="BUS11";
                mDatabaseReference = mDatabase.getReference().child("Locations").child("BUS11");
                break;
            case R.id.busbtn12:
                numberbs.setText("Selected: BUS 12");
                someVariable ="BUS12";
                mDatabaseReference = mDatabase.getReference().child("Locations").child("BUS12");
                break;
            case R.id.busbtn13:
                numberbs.setText("Selected: BUS 13");
                someVariable ="BUS13";
                mDatabaseReference = mDatabase.getReference().child("Locations").child("BUS13");
                break;
            case R.id.busbtn14:
                someVariable ="BUS14";
                numberbs.setText("Selected: BUS 14");
                mDatabaseReference = mDatabase.getReference().child("Locations").child("BUS14");
                break;
            case R.id.bustbtn15:
                numberbs.setText("Selected: BUS 15");
                someVariable ="BUS15";
                mDatabaseReference = mDatabase.getReference().child("Locations").child("BUS15");
                break;
            case R.id.busbtn16:
                numberbs.setText("Selected: BUS 16");
                someVariable ="BUS16";
                mDatabaseReference = mDatabase.getReference().child("Locations").child("BUS16");
                break;
        }
    }

}

MapsActivity.java

此处检索字符串并设置为数据库的地址

package com.manavchordia.aplparent;

import androidx.fragment.app.FragmentActivity;

import android.content.Intent;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

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.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.firebase.auth.FirebaseAuth;
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 com.google.firebase.database.annotations.NotNull;


public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, View.OnClickListener {

    private GoogleMap mMap;
    private FirebaseAuth mAuth;
    //String value_latitude = "0";
    // String value_longitue = "0";
    Double longi = 0.0;
    Double lati = 0.0;
    // String message = "BUS1";
    Button Refreshh;
    Double latitude = 0.0;
    Double longitude = 0.0;
    String vali;
    Button Backp;
    TextView BusNO;
    private CountDownTimer timer;


    private FirebaseDatabase mDatabase = FirebaseDatabase.getInstance();
    private DatabaseReference myRef = mDatabase.getReference().child("Locations").child(vali);

    // private DatabaseReference mDatabaseReference = mDatabase.getReference();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        Backp = findViewById(R.id.backbuttonmap);
        BusNO = findViewById(R.id.busnotext);
        Intent intent = getIntent();
        Bundle bundle = intent.getExtras();
        String str = bundle.getString("message");
        vali = str;
        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
        BusNO.setText(vali);
        timer = new CountDownTimer(5000, 500) {

            @Override
            public void onTick(long millisUntilFinished) {

            }

            @Override
            public void onFinish() {
                try {
                    timer.start();
                    Toast.makeText(MapsActivity.this, "Refreshing", Toast.LENGTH_LONG).show();
                    getBussGeo();

                } catch (Exception e) {
                    Log.e("Error", "Error: " + e.toString());
                }
            }
        }.start();

        Backp.setOnClickListener(this);
        Backp.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MapsActivity.this, MainActivity.class);
                timer.cancel();
                startActivity(intent);
            }
        });



    }


    /**
     * Manipulates the map once available.
     * This callback is triggered when the map is ready to be used.
     * This is where we can add markers or lines, add listeners or move the camera. In this case,
     * we just add a marker near Sydney, Australia.
     * If Google Play services is not installed on the device, the user will be prompted to install
     * it inside the SupportMapFragment. This method will only be triggered once the user has
     * installed Google Play services and returned to the app.
     */
    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        /*
        if (mMap != null) {
            LatLng sydney = new LatLng(lati, longi);
            mMap.addMarker(new MarkerOptions().position(sydney).title(vali));
            mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
        }
        */
    }

    public void getBussGeo() {

        myRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NotNull DataSnapshot dataSnapshot) {

                for (DataSnapshot ds : dataSnapshot.getChildren()) {

                    double latitude = dataSnapshot.child("latitude").getValue(Double.class);
                    double longitude = dataSnapshot.child("longitude").getValue(Double.class);
                    Log.e("Long", "onDataChange: " + longitude);
                    Log.d("lato","onDataChange" + latitude);
                    lati = latitude;
                    longi = longitude;

                    if (mMap != null) {
                        LatLng sydney = new LatLng(lati, longi);
                        mMap.addMarker(new MarkerOptions().position(sydney).title(vali));
                        mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
                    }
                }
            }

            @Override
            public void onCancelled(@NotNull DatabaseError error) {
                // Failed to read value
                Toast.makeText(getApplicationContext(), "Error!!", Toast.LENGTH_SHORT).show();

            }
        });
    }

    @Override
    public void onClick(View view) {


    }
}

点击 BUS11 时地图应该会显示位置(因为已经设置了坐标)。

但地图将位置设置为0,0

您没有将侦听器更新为具有新 vali 值的引用,请在 getBussGeo() 中执行此操作:

myRef = mDatabase.getReference().child("Locations").child(vali); 

因为引用会保存vali的初始值,你需要在从intent获取后更新它。

此外,尝试使用 Bundle 在活动之间传递数据。

在 MainActivity 中:

Intent intent = new Intent(this, MapsActivity.class);
Bundle bundle = new Bundle();
bundle.putString("message", someVariable);
intent.putExtras(bundle);
startActivity(intent);

在 MapsActivity 中:

Bundle bundle = intent.getExtras();
str = bundle.getString("message");