将JSON从php加载到片段中的字符串中?

svdrlsy4  于 4个月前  发布在  PHP
关注(0)|答案(1)|浏览(75)

**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中的数据呢?
我不能弄清楚它的生活我,我准备拉我的头发试图让它正常工作的每一个负荷,而不仅仅是第一个。

yrefmtwq

yrefmtwq1#

这是一个来自BottomNavigationItem单击时加载的片段之一的示例代码。在这些片段之间切换也会保留值。考虑到此片段与TruckFragment等效,请修改您的TruckFragment代码,如下所示,以获取BottomNavigationItem任务的结果。

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();
}

字符串

相关问题