对象: 从 url JSON 结果中获取 1 组经度和纬度坐标。加载地图并向这些坐标添加标记和相机变焦。
问题:一切正常,仅在第一次加载应用程序和其中包含地图的片段时。当您单击不同的导航按钮,然后单击该按钮返回带有地图的片段时,或者如果您单击地图片段的导航按钮,然后再次单击它,则地图只会加载直接在 OnMapReady 中使用值。然后,您必须关闭应用程序并重新打开它才能正确加载该片段。
我们在片段中有以下内容: 文本视图和地图。
我们已注释掉 OnMapReady 中的所有内容,以确保我们获得正确的数据。
我们验证数据所采取的步骤:
下一个测试是查看地图是否会加载以及我们是否正在向标记获取数据。
我们将所有地图信息添加回 OnMapReady。我们暂时使用硬编码的经度和纬度来进行标记和相机变焦。然后我们添加了一个 toast 来显示 textview.gettext.tostring()。 结果:第一次运行或加载数据存在且正确。之后的每次加载都是空/空,显示空的 toast 消息。
下面是我们在 MainActivity 中调用带有地图的片段的代码:
getSupportFragmentManager()
.beginTransaction()
.setCustomAnimations(R.anim.bottom_nav_enter, R.anim.bottom_nav_exit)
.add(R.id.container, frg)
//.replace(R.id.container, frg)
//.attach(frg)
.commitNow();
我尝试过分离/附加/删除/添加/替换,但没有效果。
下面是我的片段的完整代码,上面有地图。
package com.app.restaurant.bowzers.fragments;
import android.app.Activity;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import com.app.restaurant.bowzers.GetJSON;
import com.app.restaurant.bowzers.R;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapView;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class TruckFragment extends Fragment implements OnMapReadyCallback {
Activity mactivity;
public static TextView textviewlocation;
GoogleMap mGoogleMap;
String strlong, strlat;
String longitudestring;
String lattitudestring, mySB;
MapView mMapView;
View mView;
double locationlong, locationlat;
public TruckFragment() {
// Required empty public constructor
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
mactivity = getActivity();
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
mView = inflater.inflate(R.layout.fragment_truck, container, false);
if(this.getArguments()!=null) {
Log.d("hey", "hey");
String[] longlat =textviewlocation.getText().toString().split(",");
locationlong = Double.parseDouble(longlat [0]);
locationlat = Double.parseDouble(longlat [1]);
}
return mView;
}
TextView textView;
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
textviewlocation = view.findViewById(R.id.textviewlocation);
getJSON("https://bowzershotdogstand.com/app/get_location.php");
// String[] longlat =textviewlocation.getText().toString().split(",");
// locationlong = Double.parseDouble(longlat [0]);
// locationlat = Double.parseDouble(longlat [1]);
mMapView = mView.findViewById(R.id.truckmap);
if (mMapView != null) {
mMapView.onCreate(null);
mMapView.onResume();
mMapView.getMapAsync(this);
}
}
private void getJSON(final String urlWebService) {
class GetJSON extends AsyncTask<Void, Void, String> {
protected void onPreExecute() {
super.onPreExecute();
}
protected void onPostExecute(String s) {
super.onPostExecute(s);
mySB = s;
textviewlocation.setText(mySB);
}
protected String doInBackground(Void... Voids) {
try {
URL url = new URL(urlWebService);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
StringBuilder sb = new StringBuilder();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(con.getInputStream()));
String json;
while ((json = bufferedReader.readLine()) != null) {
sb.append((json + "\n"));
}
mySB = String.valueOf(sb);
JSONArray JA = new JSONArray(mySB);
for(int i =0 ;i <JA.length(); i++){
JSONObject JO = (JSONObject) JA.get(i);
switch (JO.getString("id")){
case "1":
strlong = JO.getString("longitude");
strlat = JO.getString("lattitude");
break;
}
}
//return sb.toString().trim();
return strlong + "," + strlat;
} catch (Exception e) {
return null;
}
}
}
GetJSON getJSON = new GetJSON();
getJSON.execute();
}
@Override
public void onMapReady(@NonNull GoogleMap googleMap) {
LatLng bowzers = new LatLng(locationlat, locationlong);
Toast.makeText(getContext(),textviewlocation.getText().toString(), Toast.LENGTH_SHORT).show();
mGoogleMap = googleMap;
googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
googleMap.addMarker(new MarkerOptions().position(new LatLng(39.918837, -82.831853)).title("Bowzers").snippet("Where Our Dogs Are NOT JUST A DOG"));
// googleMap.addMarker(new MarkerOptions().position(new LatLng(locationlat, locationlong)).title("Bowzers").snippet("Where Our Dogs Are NOT JUST A DOG"));
//googleMap.addMarker(new MarkerOptions().position(bowzers).title("Marker"));
// googleMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Bowzers").snippet("Where Our Dogs Are NOT JUST A DOG"));
CameraPosition Bowzers = CameraPosition.builder().target(new LatLng(39.918837, -82.831853)).zoom(16).bearing(0).tilt(45).build();
// CameraPosition Bowzers = CameraPosition.builder().target(new LatLng(locationlat, locationlong)).zoom(16).bearing(0).tilt(45).build();
googleMap.moveCamera(CameraUpdateFactory.newCameraPosition(Bowzers));
}
@Override
public void onResume() {
super.onResume();
getFragmentManager().beginTransaction().detach(this).attach(this).commit();
Log.i("IsRefresh", "Yes");
}
}
正如你所看到的,我什至尝试在 onResume 中进行分离、附加,但这并没有什么区别。以我的方式分离/附加应该刷新我认为的整个片段。然而它并没有刷新它。
我做错了什么,或者我错过了什么,当片段恢复时,它不会像第一次加载一样刷新,并且 OnMapReady 能够在第一次加载片段后从文本视图访问数据。
我仔细检查了 logcat,它确实到达了 OnResume,并且它确实记录了它以让我知道。
那么为什么 OnMapready 在第一次加载后看不到或无法访问全局变量或文本视图中的数据?
我一生都无法弄清楚,我已经准备好拔掉我的头发,试图让它在每个负载上正常工作,而不仅仅是第一个负载。
这是来自在 BottomNavigationItem 单击时加载的片段之一的示例代码。在这些片段之间切换也会保留该值。考虑到这个片段相当于 TruckFragment,请像下面这样修改 TruckFragment 代码以获取异步任务的结果。
TextView textView;
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
textView =view.findViewById(R.id.tvValue);
getJson();
}
private void getJson() {
class GetJSON extends AsyncTask<Void, Void, String> {
protected void onPreExecute() {
super.onPreExecute();
}
protected void onPostExecute(String s) {
super.onPostExecute(s);
mySB=s;
textView.setText(mySB);
}
protected String doInBackground(Void... Voids) {
try {
URL url = new URL("https://jsonplaceholder.typicode.com/todos/1");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
StringBuilder sb = new StringBuilder();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(con.getInputStream()));
String json;
while ((json = bufferedReader.readLine()) != null) {
sb.append((json + "\n"));
mySB = String.valueOf(sb);
}
return sb.toString().trim();
} catch (Exception e) {
return null;
}
}
}
GetJSON getJSON = new GetJSON();
getJSON.execute();
}