java - 尝试使用 Intent 获取字符串时未设置 .child()
问题描述
我正在尝试从 firebase 检索数据,为此我试图在代码中设置地址。我必须为数据库位置提供一个字符串值,然后将其传递给下一个活动并将该字符串用作地址。但是,该地址未在代码中设置,因此将地图上的位置设置为 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 的初始值,并且您需要在从意图获取后对其进行更新。
此外,尝试使用 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");
推荐阅读
- javascript - Bootstrap 4 验证无法正确使用必填字段
- html - 未排序的列表不会在一行中展开
- python - 类型错误:更新()缺少 1 个必需的位置参数:'self'
- javascript - JavaScript - reduce 示例的解释
- oracle - 如何编写 oracle 或 pl/sql 脚本以仅针对表中的“数字”数据类型查找列的平均值和中位数
- java - 如何获取 XML 代码中标签中包含的字符串?
- r - R中缺失日期/值的“插值”?
- sql-server - Microsoft.SqlServer.Management.IntegrationServices.dll 应该从哪里加载?
- r - R与Matlab中的复数
- java - 从客户端向服务器发送消息