1

私はリストビューからGoogleマップのアクティビティを開き、地図上に長押しするとその場所のアドレスをArrayListに保存してから、リストビューでは、場所のlatituteとlongituteも同様に保存され、次にSharedPreferencesを介してすべての情報を保存します。 私の問題は、アプリケーションの実行中にリストビューが更新されても、アプリを再起動するとすべてのデータが失われます。基本的に情報が最初に保存されることはありません。 データの保存は、MapsActivityのonMapLongClickメソッドで行われ、データの読み込みはMainActivityのOnCreateメソッドで行われます。アンドロイド:SharedPreferencesがデータを保存していません

MainActivity:

​​

MapsActivity:

package com.rapha.favoriteplaces; 

import android.*; 
import android.Manifest; 
import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.content.pm.PackageManager; 
import android.location.Address; 
import android.location.Geocoder; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.net.Uri; 
import android.os.Build; 
import android.os.Handler; 
import android.support.annotation.NonNull; 
import android.support.v4.app.ActivityCompat; 
import android.support.v4.app.FragmentActivity; 
import android.os.Bundle; 
import android.support.v4.content.ContextCompat; 
import android.util.Log; 
import android.view.GestureDetector; 
import android.view.MotionEvent; 
import android.widget.Toast; 
import com.google.android.gms.appindexing.Action; 
import com.google.android.gms.appindexing.AppIndex; 
import com.google.android.gms.appindexing.Thing; 
import com.google.android.gms.common.api.GoogleApiClient; 
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.BitmapDescriptorFactory; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.Marker; 
import com.google.android.gms.maps.model.MarkerOptions; 
import java.io.IOException; 
import java.util.List; 
import java.util.Locale; 

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, GoogleMap.OnMapLongClickListener { 

    private GoogleMap mMap; 
    LocationManager locationManager; 
    LocationListener locationListener; 
    String address; 

    @Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 

     if (grantResults.length > 0 && grantResults[0] != PackageManager.PERMISSION_GRANTED) { 
      if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
       locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5, 100000, locationListener); 
      } 
     } 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_maps); 
     // 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); 
    } 
    /** 
    * 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; 

     Intent intent = getIntent(); 

     mMap.setOnMapLongClickListener(this); 
     int coisa = intent.getIntExtra("coisa", 0); 

     if(coisa == 0) 
     { 
      locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); 

      locationListener = new LocationListener() { 
       @Override 
       public void onLocationChanged(Location location) { 

        LatLng userLocation = new LatLng(location.getLatitude(), location.getLongitude()); 

        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(userLocation, 15)); 
       } 

       @Override 
       public void onStatusChanged(String provider, int status, Bundle extras) { 

       } 

       @Override 
       public void onProviderEnabled(String provider) { 

       } 

       @Override 
       public void onProviderDisabled(String provider) { 

       } 
      }; 
      if (Build.VERSION.SDK_INT < 23) { 
       locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 100, locationListener); 
      } else { 
       if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1); 
       } else { 
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 100, locationListener); 
        mMap.clear(); 
        Location lastKnownLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
        LatLng userLocation = new LatLng(lastKnownLocation.getLatitude(), lastKnownLocation.getLongitude()); 
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(userLocation, 15)); 
       } 
      } 
     } 
     else 
     { 
      double lat = Double.parseDouble(intent.getStringExtra("lat")); 
      double lon = Double.parseDouble(intent.getStringExtra("lon")); 
      LatLng location = new LatLng(lat, lon); 

      mMap.addMarker(new MarkerOptions().position(location).title(intent.getStringExtra("ad"))); 
      mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(location, 15)); 
     } 
    } 
    @Override 
    public void onMapLongClick(LatLng latLng) { 

     Geocoder geocoder = new Geocoder(getApplicationContext(), Locale.getDefault()); 
     try { 
      List<Address> addresses = geocoder.getFromLocation(latLng.latitude, latLng.longitude, 1); 

      if (addresses != null && addresses.size() > 0) { 

       address = addresses.get(0).getAddressLine(0); 
      } 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     mMap.addMarker(new MarkerOptions().position(latLng).title(address)); 
     MainActivity.lats.add(String.valueOf(latLng.latitude)); 
     MainActivity.lngs.add(String.valueOf(latLng.longitude)); 
     MainActivity.places.add(address); 
     MainActivity.arrayAdapter.notifyDataSetChanged(); 

     SharedPreferences sharedPreferences = getSharedPreferences("com.rapha.favoriteplaces",Context.MODE_PRIVATE); 

     try { 

      sharedPreferences.edit().putString("lats", ObjectSerializer.serialize(MainActivity.lats)).apply(); 
      sharedPreferences.edit().putString("lngs", ObjectSerializer.serialize(MainActivity.lngs)).apply(); 

      sharedPreferences.edit().putString("places", ObjectSerializer.serialize(MainActivity.places)).apply(); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

オブジェクトシリアライザクラス:

import java.io.ByteArrayInputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.io.Serializable; 

public class ObjectSerializer { 

    public static String serialize(Serializable obj) throws IOException { 
     if (obj == null) return ""; 
     try { 
      ByteArrayOutputStream serialObj = new ByteArrayOutputStream(); 
      ObjectOutputStream objStream = new ObjectOutputStream(serialObj); 
      objStream.writeObject(obj); 
      objStream.close(); 
      return encodeBytes(serialObj.toByteArray()); 
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 
    } 

    public static Object deserialize(String str) throws IOException { 
     if (str == null || str.length() == 0) return null; 
     try { 
      ByteArrayInputStream serialObj = new ByteArrayInputStream(decodeBytes(str)); 
      ObjectInputStream objStream = new ObjectInputStream(serialObj); 
      return objStream.readObject(); 
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 
    } 

    public static String encodeBytes(byte[] bytes) { 
     StringBuffer strBuf = new StringBuffer(); 

     for (int i = 0; i < bytes.length; i++) { 
      strBuf.append((char) (((bytes[i] >> 4) & 0xF) + ((int) 'a'))); 
      strBuf.append((char) (((bytes[i]) & 0xF) + ((int) 'a'))); 
     } 

     return strBuf.toString(); 
    } 

    public static byte[] decodeBytes(String str) { 
     byte[] bytes = new byte[str.length()/2]; 
     for (int i = 0; i < str.length(); i += 2) { 
      char c = str.charAt(i); 
      bytes[i/2] = (byte) ((c - 'a') << 4); 
      c = str.charAt(i + 1); 
      bytes[i/2] += (c - 'a'); 
     } 
     return bytes; 
    } 
} 

答えて

0

あなたはに入れて2人の異なる好みからなっているようです。好みからフェッチする場合は

、あなたはpackage com.rapha.favoriteplacesを使用している:

SharedPreferences sharedPreferences = this.getSharedPreferences("package com.rapha.favoriteplaces", Context.MODE_PRIVATE); 
try { 
    places = (ArrayList<String>) ObjectSerializer.deserialize(sharedPreferences.getString("places", ObjectSerializer.serialize(new ArrayList<String>()))); 
    // ... 

あなたがcom.rapha.favoriteplacesを使用した値を保存する場合:

SharedPreferences sharedPreferences = getSharedPreferences("com.rapha.favoriteplaces",Context.MODE_PRIVATE); 
sharedPreferences.edit().putString("lats", ObjectSerializer.serialize(MainActivity.lats)).apply(); 

してみてくださいし、それらの両方が同じとしてください。

+0

私はこのような愚かな間違いをしていたとは思っていませんので、どうもありがとうございます。 – Motoboy

関連する問題