**Object:**从url JSON结果中获取1组经度和Lattitude坐标。加载Map并添加标记和相机缩放到这些坐标。
**问题:**只有在第一次加载应用程序和包含Map的片段时,一切正常。当您单击不同的导航按钮,然后单击该按钮返回到包含Map的片段时,或者如果您单击Map片段的导航按钮,然后再次单击它,则Map将仅直接在OnMapReady中加载值。然后您必须关闭应用程序并重新打开它,以便正确加载该片段。
我们在片段中有以下内容:Textview和Map。
我们已经注解掉了OnMapReady中的所有内容,以确保我们获得正确的数据。
我们为验证数据所采取的步骤:
1.打开App
1.点击导航按钮打开带有Map的片段。
1.查看textview以确保它从url中提取了正确的数据。
1.打开phpmyadmin,更改数据。
1.点击按钮加载不同的片段。
1.点击按钮以加载带有Map的片段。结果:Textview填充了正确的数据。
下一个测试是看看Map是否会加载,以及我们是否会将数据发送到标记。
我们将所有Map信息添加回OnMapReady。我们暂时使用硬编码的经度和纬度来进行标记和相机缩放。然后我们添加了一个吐司来显示textview.gettext.tostring()。结果:第一次运行或加载数据是正确的。之后的每次加载都是null /空,显示一个空的toast消息。
下面是我们用来在MainActivity中调用带有map的片段的代码:
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();
字符串
我已经尝试了分离/附加/删除/添加/替换,没有区别。
下面是我的片段的完整代码,上面有Map。
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();
Log.i("IsRefresh", "Yes");
getJSON("https://bowzershotdogstand.com/app/get_location.php");
Toast.makeText(getContext(),textviewlocation.getText().toString(), Toast.LENGTH_SHORT).show();
}
型
正如你所看到的,我甚至试着在onResume中做detach和attach,但这并没有什么区别。detach / attach的方式应该会刷新我认为的整个片段。然而,它并没有刷新它。
我做错了什么,或者我错过了什么,当片段恢复时,它不会像第一次加载一样刷新,并且OnMapReady能够在第一次加载片段后从textview访问数据。
我仔细检查了logcat,它确实到达了OnResume,它确实记录了它,让我知道。
那么,为什么OnMapready在第一次加载后看不到或无法访问全局变量或textview中的数据呢?
我不能弄清楚它的生活我,我准备拉我的头发试图让它正常工作的每一个负荷,而不仅仅是第一个。
1条答案
按热度按时间yrefmtwq1#
这是一个来自BottomNavigationItem单击时加载的片段之一的示例代码。在这些片段之间切换也会保留值。考虑到此片段与TruckFragment等效,请修改您的TruckFragment代码,如下所示,以获取BottomNavigationItem任务的结果。
字符串