如何将当前位置从一项活动发送到另一项活动?

Posted

技术标签:

【中文标题】如何将当前位置从一项活动发送到另一项活动?【英文标题】:How can I send current location from one activity to another? 【发布时间】:2016-03-07 16:53:12 【问题描述】:

我正在使用地图获取当前位置,现在我想将我的当前位置发送到另一个活动,该活动具有输入所有数据的形式。 我对应该使用哪些变量和方法来发送位置数据感到困惑。

ChooseFromMapActivity

这是我获取当前位置的活动。现在点击 useLocation 布局,我想将此位置发送到另一个活动的编辑文本,即 GoSendActivity。

public class ChooseFromMapActivity extends AppCompatActivity implements
        LocationListener, GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener 

    private LocationRequest mLocationRequest;
    GoogleMap mGoogleMap;

    private GoogleApiClient mGoogleApiClient;
    boolean mUpdatesRequested = false;
    private LatLng center;
    private LinearLayout markerLayout;
    private Geocoder geocoder;
    private List<Address> addresses;
    private TextView Address;
    double latitude;
    double longitude;
    private GPSTracker gps;
    private LatLng curentpoint;
    private LinearLayout useLocation;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_choose_from_map);
        Address = (TextView) findViewById(R.id.textShowAddress);
        markerLayout = (LinearLayout) findViewById(R.id.locationMarker);
        useLocation = (LinearLayout)findViewById(R.id.LinearUseLoc);

        int status = GooglePlayServicesUtil
                .isGooglePlayServicesAvailable(getBaseContext());

        if (status != ConnectionResult.SUCCESS)  // Google Play Services are
            // not available

            int requestCode = 10;
            Dialog dialog = GooglePlayServicesUtil.getErrorDialog(status, this,
                    requestCode);
            dialog.show();

         else  // Google Play Services are available

            // Getting reference to the SupportMapFragment
            // Create a new global location parameters object
            mLocationRequest = LocationRequest.create();

            /*
             * Set the update interval
             */
            mLocationRequest.setInterval(GData.UPDATE_INTERVAL_IN_MILLISECONDS);

            // Use high accuracy
            mLocationRequest
                    .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

            // Set the interval ceiling to one minute
            mLocationRequest
                    .setFastestInterval(GData.FAST_INTERVAL_CEILING_IN_MILLISECONDS);

            // Note that location updates are off until the user turns them on
            mUpdatesRequested = false;

            /*
             * Create a new location client, using the enclosing class to handle
             * callbacks.
             */
            mGoogleApiClient = new GoogleApiClient.Builder(this)
                    .addApi(LocationServices.API).addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this).build();

            mGoogleApiClient.connect();
        

        useLocation.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 


            
        );
    

    private void stupMap() 
        try 

            mGoogleMap = ((MapFragment) getFragmentManager().findFragmentById(
                    R.id.map)).getMap();

            // Enabling MyLocation in Google Map
            mGoogleMap.setMyLocationEnabled(true);
            mGoogleMap.getUiSettings().setZoomControlsEnabled(true);
            mGoogleMap.getUiSettings().setMyLocationButtonEnabled(true);
            mGoogleMap.getUiSettings().setCompassEnabled(true);
            mGoogleMap.getUiSettings().setRotateGesturesEnabled(true);
            mGoogleMap.getUiSettings().setZoomGesturesEnabled(true);

            gps = new GPSTracker(this);

            gps.canGetLocation();

            latitude = gps.getLatitude();
            longitude = gps.getLongitude();
            curentpoint = new LatLng(latitude, longitude);

            CameraPosition cameraPosition = new CameraPosition.Builder()
                    .target(curentpoint).zoom(19f).tilt(70).build();

            mGoogleMap.setMyLocationEnabled(true);
            mGoogleMap.animateCamera(CameraUpdateFactory
                    .newCameraPosition(cameraPosition));
            // Clears all the existing markers
            mGoogleMap.clear();

            mGoogleMap.setOnCameraChangeListener(new OnCameraChangeListener() 

                @Override
                public void onCameraChange(CameraPosition arg0) 
                    // TODO Auto-generated method stub
                    center = mGoogleMap.getCameraPosition().target;

                    mGoogleMap.clear();
                    markerLayout.setVisibility(View.VISIBLE);

                    try 
                        new GetLocationAsync(center.latitude, center.longitude)
                                .execute();

                     catch (Exception e) 
                    
                
            );


         catch (Exception e) 
            e.printStackTrace();
        
    

    @Override
    public void onLocationChanged(Location location) 
        // TODO Auto-generated method stub

    

    @Override
    public void onConnectionFailed(ConnectionResult arg0) 
        // TODO Auto-generated method stub

    

    @Override
    public void onConnected(Bundle arg0) 
        // TODO Auto-generated method stub
        stupMap();

    

    private class GetLocationAsync extends AsyncTask<String, Void, String> 

        // boolean duplicateResponse;
        double x, y;
        StringBuilder str;

        public GetLocationAsync(double latitude, double longitude) 
            // TODO Auto-generated constructor stub

            x = latitude;
            y = longitude;
        

        @Override
        protected String doInBackground(String... params) 

            try 
                geocoder = new Geocoder(ChooseFromMapActivity.this, Locale.ENGLISH);
                addresses = geocoder.getFromLocation(x, y, 1);
                str = new StringBuilder();
                if (Geocoder.isPresent()) 

                    if ((addresses != null) && (addresses.size() > 0)) 
                        Address returnAddress = addresses.get(0);

                        String localityString = returnAddress.getLocality();
                        String city = returnAddress.getCountryName();
                        String region_code = returnAddress.getCountryCode();
                        String zipcode = returnAddress.getPostalCode();

                        str.append(localityString + "");
                        str.append(city + "" + region_code + "");
                        str.append(zipcode + "");
                    
                 else 
                
             catch (IOException e) 
                Log.e("tag", e.getMessage());
            
            return null;

        

        @Override
        protected void onPostExecute(String result) 
            try 
                Address.setText(addresses.get(0).getAddressLine(0)
                        + addresses.get(0).getAddressLine(1) + " ");
             catch (Exception e) 
                e.printStackTrace();
            
        

        @Override
        protected void onProgressUpdate(Void... values) 

        
    

    @Override
    public void onConnectionSuspended(int arg0) 
        // TODO Auto-generated method stub

    

GoSendActivity

这是我的 GoSendActivity,它具有编辑文本视图。我想从文本视图中获取 edttxt_ 上的当前位置。

    public class GoSend extends AppCompatActivity 
    LatLng latLng;
    private GoogleMap mMap;
    MarkerOptions markerOptions;
    LinearLayout ll;
    Toolbar toolbar;
    EditText editTextLocation;
    EditText edtxt_from;
    EditText edtxt_to;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.gosendlayout);

        setUI();

        if (Build.VERSION.SDK_INT >= 21) 
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            getWindow().setStatusBarColor(getResources().getColor(R.color.colorPrimaryDark));
        
    

    @Override
    public boolean onOptionsItemSelected(MenuItem item) 
        switch (item.getItemId()) 
            // Respond to the action bar's Up/Home button
            case android.R.id.home:
                NavUtils.navigateUpFromSameTask(this);
                return true;
        
        return super.onOptionsItemSelected(item);
    

    public void setUI() 

        ll = (LinearLayout) findViewById(R.id.LinearLayoutGoSend);
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setTitle("GO-SEND");


        try 
            if (mMap == null) 
                mMap = ((MapFragment) getFragmentManager().
                        findFragmentById(R.id.map)).getMap();
            
            mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
            LatLng sydney = new LatLng(-34, 151);
            mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
            mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
            mMap.setMyLocationEnabled(true);
         catch (Exception e) 
            e.printStackTrace();
        

         edtxt_from=(EditText)findViewById(R.id.editText_from);
         edtxt_to=(EditText)findViewById(R.id.editText_to);

        edtxt_from.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 

                Intent i=new Intent(getApplicationContext(),PickLocationActivity.class);
                startActivity(i);
            
        );

        edtxt_to.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 

                Intent  i=new Intent(getApplicationContext(),PickLocationActivity.class);
                startActivity(i);
            
        );

        

位置类

    public class Location 

    private int id;
    private String mFrom_loc;
    private String mTo_loc;
    private String mFromloc_details;
    private String mToloc_details;
    private String mItems_details;

    public Location(int id,String mFrom_loc,String mFromloc_details,String mTo_loc,String mToloc_details,String mItems_details)
    
        this.id=id;
        this.mFrom_loc=mFrom_loc;
        this.mFromloc_details=mFromloc_details;
        this.mTo_loc=mTo_loc;
        this.mToloc_details=mToloc_details;
        this.mItems_details=mItems_details;

    

    public Location(String mFrom_loc)
        this.mFrom_loc=mFrom_loc;
    
    public Location()

    public int getId(int id)return id;
    public String getmFrom_loc(String mFrom_loc)return mFrom_loc;
    public String getmTo_loc(String mTo_loc)return  mTo_loc;
    public String getmFromloc_details(String mFromloc_details)return mFromloc_details;
    public String getmToloc_details(String mToloc_details)return mToloc_details;
    public String getmItems_details(String mItems_details)return mItems_details;



   public void setId()this.id=id;
    public void setmFrom_loc()this.mFrom_loc=mFrom_loc;
    public void setmTo_loc()this.mTo_loc=mTo_loc;
    public  void setmFromloc_details()this.mFromloc_details=mFromloc_details;
    public void setmToloc_details()this.mToloc_details=mToloc_details;
    public void setmItems_details()this.mItems_details=mItems_details;


我怎样才能做到这一点?请帮忙..

【问题讨论】:

设置一个 onClickListener 并创建新的 Intent() 并使用 putExtra() 方法在其中添加您的位置。稍微用谷歌搜索一下,你会看到很多例子。 相关:***.com/questions/2091465/… 是的,我可以通过 put extra 方法传递给另一个活动。但是如何将我的位置添加到位置类变量中? 我认为您在Location-class 中的设置和获取功能已交换。我真的不明白你的问题。您不想知道如何在Location-class 实例中设置值吗?这就是 setter 的用途。 使用这个答案***.com/questions/28572267/…>它可能对你有帮助 【参考方案1】:

试试这个:

useLocation.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 

            Intent intent = new Intent(ChooseFromMapActivity.this , GoSendActivity.class);
            intent.putExtra("Latitude", latitude);
            intent.putExtra("Longitude", longitude);
            startActivity(intent);
        
    );

在 GoSendActivity 的 onCreate 中,像这样获取纬度和经度:

Bundle extras = getIntent().getExtras();
if (extras != null) 
    double latitude = extras.getDouble("Latitude");
    double longitude = extras.getDouble("Longitude");

现在您可以将经纬度设置为编辑文本edittext.setText(String.valueOf(latitude));

【讨论】:

感谢您的回复。我会试试这个。但我的纬度和经度存储在 latlang 的中心变量中。获得单独的纬度和经度值会有所帮助吗? @bhargav 我想在我的编辑文本视图中显示反向地理编码值。 @bhargav 参考***.com/questions/15264884/…和***.com/questions/472313/… 我已经完成了获取反向地理编码位置的这一步。现在我只想在 GoSendActivity 的编辑文本视图中看到这个。 @bhargav 如果我将此代码放在 GoSend Activity 的 onCreate 中,它会给我异常尝试在空对象引用上调用虚拟方法'double android.os.Bundle.getDouble(java.lang.String)'双纬度 = intent2.getExtras().getDouble("Latitude");这一行。【参考方案2】:

除了使用意图将数据传递给下一个活动之外,您还可以使用共享首选项,TinyDB lib 在缓存数据方面取得了很好的效果。你需要在你的 gradle 文件中同步这个:

compile 'com.mukesh:tinydb:1.0.1'

然后在每个活动的 onCreate 中,您将使用相同的方法,通过传递应用程序上下文来初始化 tinyDB

TinyDB tinyDB = new TinyDB(getApplicationContext());

您可以使用键值对在应用程序中存储和检索任何数据,例如存储您的坐标,只需调用:

tinyDB.putDouble("latitude",latitude);
tinyDB.putDouble("longitude",longitude);

您可以通过这种方式检索数据:

double latitude = tinyDB.getDouble("latitude");
double longitude = tinyDB.getDouble("longitude");

这个类支持所有的数据格式,从Strings、Double、Float,甚至像arrayLists这样的对象。强烈建议您尝试一下。

【讨论】:

sharedPref 上使用这个库有什么优缺点? @androidXP tinyDB 库直接来自共享偏好。所有共享偏好的优点和缺点都是 tinyDB 的优点和缺点。你可以在这里查看原始的 java 文件link 如果两者相同,则没有理由添加额外的库 @androidXp 是正确的。与原始共享首选项架构相比,它使共享首选项实例更易于使用且体积更小。但那只是我的个人意见。您可以同时尝试并选择最适合您的一种,但它们的缓存架构是相同的。 实际上我正在使用共享首选项,并没有发现任何问题。我认为这将是一些有用的东西,我也可以实施。谢谢你的意见【参考方案3】:

将此类设为可序列化并使用 bundle.putSerializable("myclaa",location) 将其放入意图中。

类位置实现 Seraializable

【讨论】:

以上是关于如何将当前位置从一项活动发送到另一项活动?的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符串从一项活动发送到另一项活动?

无法将位置从一项活动返回到另一项活动

java 将一项活动的数据发送到另一项活动

将值从一项活动更新到另一项活动

如何将数据从一项活动传递到多项活动?

如何在 Android Java 中将 1000 多个项目列表从一个 Activity 发送到另一个?