>source

저는 Android 개발이 처음입니다. 앱을 만드는 것은 이번이 처음입니다. 홈, 검색, 지도 및 계정 조각 사이를 탐색할 수 있는 4개의 조각이 있는 탭 탐색 앱을 만들었습니다.주요 활동. 나는 사용했다서포트맵프래그먼트내 안에MapsFragment지도를 표시합니다. 방문시MapsFragment지도는 내 현재 위치를 표시 및 확대하고 Firebase 인스턴스에서 검색한 특정 중요한 위치를 마커로 강조 표시합니다.

처음 앱을 실행하고 지도 조각을 방문하면 모든 것이 예상대로 작동합니다. 현재 위치로 확대되어 필요한 모든 마커가 표시됩니다. 문제는 해당 지점에서 다른 조각으로 전환할 때 발생합니다. 홈, 검색 또는 계정 조각으로 이동한 다음 지도 조각으로 돌아가면 위치 마커가 더 이상 표시되지 않습니다. 나는 여전히 내 현재 위치를 볼 수 있고 지도 조각을 열 때 확대되지만 다른 마커는 사라집니다.

원래는 내가 사용할 때 다른 조각으로 이동할 때마다 조각이 다시 생성되는 것과 관련이 있다고 생각했습니다..replace(컨테이너, 조각)하단 탐색 모음에서 클릭한 버튼을 기반으로 프래그먼트를 변경합니다. 하지만 지도 조각이 내 현재 위치를 로드하고 올바르게 확대하는 것을 관찰했습니다.로드맵()함수가 실행되지만 어떻게 든 마커가 나타나지 않습니다. 앱을 다시 시작하면 처음으로 지도 조각을 열 때 마커가 올바르게 작동합니다.

다른 조각으로 이동한 후 지도로 돌아갈 때 지도에 마커를 계속 표시하는 방법에 대한 도움을 주시면 대단히 감사하겠습니다. 감사합니다!

여기에 내MapsFragment.java:

public class MapsFragment extends Fragment {
    private SupportMapFragment supportMapFragment;
    private AutocompleteSupportFragment autocompleteSupportFragment;
    private FusedLocationProviderClient client;
    private Geocoder geocoder;
    private ArrayList mPostCodes;
    private ArrayList searchMarker;
    private DatabaseReference locationRef;
    private DatabaseReference businessRef;
    private String apiKey;
    public MapsFragment() {
        //Required empty public constructor
    }
    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        //Initialize Map fragment
        supportMapFragment= (SupportMapFragment)
                getChildFragmentManager().findFragmentById(R.id.google_map);
        //initialize Places client
        apiKey= getString(R.string.map_key);
        if(!Places.isInitialized()){
            Places.initialize(requireActivity(), apiKey);
        }
        PlacesClient placesClient= Places.createClient(requireActivity());
        //Initialize AutoComplete search bar and set autocomplete parameters
        autocompleteSupportFragment= (AutocompleteSupportFragment)
                getChildFragmentManager().findFragmentById(R.id.autocomplete_fragment);
        autocompleteSupportFragment.setTypeFilter(TypeFilter.ADDRESS);
        autocompleteSupportFragment.setLocationBias(RectangularBounds.newInstance(
                new LatLng(55.836229, -4.252612),
                new LatLng(55.897463, -4.325364)));
        autocompleteSupportFragment.setCountries("UK");
        autocompleteSupportFragment.setPlaceFields(Arrays.asList(Place.Field.ID, Place.Field.NAME, Place.Field.LAT_LNG));
        //initialize search marker list
        searchMarker= new ArrayList();
        //Initialize client to get user's last location on device
        client= LocationServices.getFusedLocationProviderClient(requireActivity());
        //Initialize geocoder to convert business postcodes to latlng coordinates
        mPostCodes= new ArrayList<>();
        geocoder= new Geocoder(requireActivity());
        //Get business locations
        locationRef= FirebaseDatabase.getInstance().getReference("Business Locations");
        locationRef.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                if(snapshot.exists()){
                    for(DataSnapshot locationSnapshot : snapshot.getChildren()){
                        BusinessLocation location= locationSnapshot.getValue(BusinessLocation.class);
                        mPostCodes.add(location.getPostCode());
                    }
                }
            }
            @Override
            public void onCancelled(@NonNull DatabaseError error) {
                Log.i("Location error", "Error retrieving location: ", error.toException().getCause());
            }
        });
        //initialize reference to business table
        businessRef= FirebaseDatabase.getInstance().getReference("Businesses");
        //render the map
        loadMap();
    }
    private void loadMap() {
        if (ActivityCompat.checkSelfPermission(requireActivity(),
                Manifest.permission.ACCESS_FINE_LOCATION)== PackageManager.PERMISSION_GRANTED) {
            Task task= client.getLastLocation();
            task.addOnSuccessListener(new OnSuccessListener() {
                @Override
                public void onSuccess(Location location) {
                    if(location != null){
                        supportMapFragment.getMapAsync(new OnMapReadyCallback() {
                            @Override
                            public void onMapReady(@NonNull GoogleMap googleMap) {
                                //autocomplete place search
                                autocompleteSupportFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() {
                                    @Override
                                    public void onError(@NonNull Status status) {
                                        Log.i("AutoComplete error", "error status: " + status);
                                    }
                                    @Override
                                    public void onPlaceSelected(@NonNull Place place) {
                                        LatLng placeLatLng= place.getLatLng();
                                        MarkerOptions placeOptions= new MarkerOptions().position(placeLatLng)
                                                .title("search")
                                                .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE));
                                        if(!searchMarker.isEmpty()){
                                            Marker searchedMarker= searchMarker.get(0);
                                            searchMarker.remove(searchedMarker);
                                            searchedMarker.remove();
                                        }
                                        final Marker marker= googleMap.addMarker(placeOptions);
                                        searchMarker.add(marker);
                                        googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(placeLatLng, 10));
                                    }
                                });
                                LatLng myLatLng= new LatLng(location.getLatitude(),
                                        location.getLongitude());
                                //show current location
                                if (ActivityCompat.checkSelfPermission(requireActivity(),
                                        Manifest.permission.ACCESS_FINE_LOCATION)== PackageManager.PERMISSION_GRANTED) {
                                    googleMap.setMyLocationEnabled(true);
                                    googleMap.getUiSettings().setZoomControlsEnabled(true);
                                    googleMap.getUiSettings().setCompassEnabled(true);
                                }
                                //show markers for all businesses on database
                                for(String code : mPostCodes){
                                    try{
                                        Address address= geocoder.getFromLocationName(code, 1).get(0);
                                        LatLng latLng= new LatLng(address.getLatitude(), address.getLongitude());
                                        MarkerOptions options= new MarkerOptions().position(latLng);
                                        googleMap.addMarker(options);
                                    }catch (IOException e){
                                       Toast.makeText(requireActivity(), e.getMessage(), Toast.LENGTH_LONG).show();
                                    }
                                }
                                googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(myLatLng, 10));
                            }
                        });
                    }
                }
            });
        }else {
            ActivityCompat.requestPermissions(requireActivity(),
                    new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 44);
        }
    }
    private ActivityResultLauncher mPermissionResult= registerForActivityResult(
            new ActivityResultContracts.RequestPermission(),
            result -> {
                if(result){
                    loadMap();
                }
            }
    );
}

여기 내fragment_maps.xml파일:

        

여기 내MainActivity.kt파일:

class MainActivity : AppCompatActivity() {
    private val homeFragment= HomeFragment()
    private val searchFragment= SearchFragment()
    private val mapFragment= MapsFragment()
    private val accountFragment= AccountFragment()
    private val guestAccountFragment= GuestAccountFragment()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        replaceFragment(homeFragment)
        bottom_navigation.setOnItemSelectedListener {
            when (it.itemId) {
                R.id.id_home -> replaceFragment(homeFragment)
                R.id.id_search -> replaceFragment(searchFragment)
                R.id.id_map -> replaceFragment(mapFragment)
                R.id.id_account -> {
                    if(FirebaseAuth.getInstance().currentUser== null){
                        replaceFragment(guestAccountFragment)
                    }else {
                        replaceFragment(accountFragment)
                    }
                }
            }
            true
        }
    }
    private fun replaceFragment(fragment : Fragment){
        if(fragment != null){
            val transaction= supportFragmentManager.beginTransaction()
            transaction.replace(R.id.fragment_container, fragment)
            transaction.commit()
        }
    }
}

  • 답변 # 1

    새 조각으로 교체한 후 지도 조각이 "죽어가기" 때문에 발생합니다. 이 솔루션을 사용해 보세요.

    우선 호출할 수 있는 모든 필수 조각을 기본 활동에 추가해야 합니다.

    getSupportFragmentManager().beginTransaction()
                    .add(R.id.fragment_container_view, fragment1)
                    .add(R.id.fragment_container_view, fragment2)
                    .add(R.id.fragment_container_view, fragment3)
                    .commit();
    

    추가한 후 다음 code를 호출하여 변경할 수 있습니다.

    getSupportFragmentManager().beginTransaction()
                        .show(fragment2)
                        .hide(fragment1)
                        .commit();
    

    code는 Java로 작성되었지만 문제가 없다고 생각합니다.

  • 이전 java : 데이터 유형 time 및 datetime은 같음 연산자에서 호환되지 않습니다.
  • 다음 C++ for 루프를 사용하는 가장 좋은 방법