2012-01-05 8 views
9

He buscado bastantes lugares pero todavía no me he encontrado con ninguna buena solución que funcionara, ¡y realmente necesito ayuda! Estoy haciendo una aplicación que necesita pasar una cadena de longitud y latitud de una actividad a otra. ¿Cómo puedo hacer esto? Eche un vistazo a mi código aquí: LocationActivity.java necesita pasar la cadena a la otra actividad y a otra que no pegué aquí. Y la cadena que tiene que ser pasado se llama: "latLongString"Pasando cadenas entre actividades en Android

LocationActivity.java:

import android.R.string; 
import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.TextView; 

public class LocationActivity extends Activity { 
private String Location; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    LocationManager locManager; 
    locManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
    locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000L,500.0f, locationListener); 
    Location location = locManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
    updateWithNewLocation(location); 
    if(location != null)         
    { 
     double latitude = location.getLatitude(); 
    double longitude = location.getLongitude(); 
    } 
    } 


private void updateWithNewLocation(Location location) { 
    TextView myLocationText = (TextView)findViewById(R.id.LocationWord); 
    String latLongString = ""; 
    if (location != null) { 
     double lat = location.getLatitude(); 
     double lng = location.getLongitude(); 
     latLongString = "Lat:" + lat + "\nLong:" + lng; 
     //This is where i need to pass the string to the other activity 

    } else { 
     latLongString = "No location found"; 
    } 
    myLocationText.setText("Your Current Position is:\n" + 
      latLongString); 
} 

private final LocationListener locationListener = new LocationListener() { 
    public void onLocationChanged(Location location) { 
     updateWithNewLocation(location); 
    } 

    public void onProviderDisabled(String provider) { 
     updateWithNewLocation(null); 
    } 

    public void onProviderEnabled(String provider) { 
    } 

    public void onStatusChanged(String provider, int status, Bundle extras) { 
    } 
}; 


} 

La otra actividad:

import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.io.OutputStreamWriter; 
import java.util.List; 
import java.util.Locale; 

import android.R.string; 
import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.location.Address; 
import android.location.Criteria; 
import android.location.Geocoder; 
import android.location.Location; 
import android.os.Bundle; 
import android.os.Environment; 
import android.telephony.gsm.SmsMessage; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.Toast; 
import android.location.LocationManager; 
import android.location.LocationListener; 

public class FindAndroidActivity extends Activity implements OnClickListener { 
/** Called when the activity is first created. */ 
Button Nextbutton1, Nextbutton2, Nextbutton3, TestLocationService, EditSettings; 
TextView Cordinates, Adress, FindAndroid, TextView; 
EditText LocationWord; 
private LocationManager locManager; 
private LocationListener locListener; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
     setContentView(R.layout.firsttimescreen); 
     Nextbutton1 = (Button)findViewById(R.id.Nextbutton1); 
     Nextbutton1.setOnClickListener(this); 
} 
public void onClick(View src) { 
    switch(src.getId()) { 
    case R.id.Nextbutton1: 
     setContentView(R.layout.setup); 
     Nextbutton2 = (Button)findViewById(R.id.Nextbutton2); 
     TestLocationService = (Button)findViewById(R.id.TestLocationService); 
     TestLocationService.setOnClickListener(this); 
     Nextbutton2.setOnClickListener(this); 
     break; 
    case R.id.Nextbutton2: 
     setContentView(R.layout.setup1); 
     Nextbutton3 = (Button)findViewById(R.id.Nextbutton3); 
     LocationWord = (EditText)findViewById(R.id.LocationWord); 
     LocationWord.requestFocus(View.FOCUS_DOWN); 
     Nextbutton3.setOnClickListener(this); 
     break; 
    case R.id.Nextbutton3: 
     setContentView(R.layout.main); 
     EditSettings = (Button)findViewById(R.id.EditSettings); 
     EditSettings.setOnClickListener(this); 
     break; 
    case R.id.TestLocationService: 
     Bundle extras = getIntent().getExtras(); 
     if(extras !=null) { 
      String value = extras.getString("KEY");    
     } 
     Cordinates = (TextView)findViewById(R.id.Cordinates); 
     Cordinates.setText(value); 
      //This does not work because the string "value" isn't availible outside the braces, 
      //obviously. How do i make it availible there??? 
     break; 
    case R.id.EditSettings: 
     setContentView(R.layout.setup1); 
     Nextbutton3 = (Button)findViewById(R.id.Nextbutton3); 
     LocationWord = (EditText)findViewById(R.id.LocationWord); 
     LocationWord.requestFocus(View.FOCUS_DOWN); 
     Nextbutton3.setOnClickListener(this); 
     break; 
    } 
} 

}

+1

Debe utilizar putExtra (funciones getExtras() (o) GetString) y de la clase Intención respondida aquí: [PutExtra/GetExtra] [1] [1]: http: // stackoverflow. com/questions/5265913/how-to-use-putextra-and-getextra-for-string-data –

Respuesta

33

En su clase de LocationActivity:

Intent i = new Intent(this, FindAndroidActivity.class); 
i.putExtra("KEY",YourData); 

En la clase FindAndroidActivity

Bundle extras = getIntent().getExtras(); 
if(extras !=null) { 
    String value = extras.getString("KEY"); 
} 
9

par de escenarios:

  1. Si desea pasar la cadena cuando comienza la nueva actividad, agréguela al Intento inicial y recupérela en la actividad nueva onCreate.
    Sending arrays with Intent.putExtra

    // Sending activity 
    String latLong = "test"; 
    Intent i = new Intent(sendingClass.this, receivingClass.class); 
    i.putExtra("latLong", latLong); 
    startActivity(i); 
    
    // Receiving activity 
    Bundle extras = getIntent().getExtras(); 
    String latLong = extras.getString("latLong"); 
    
  2. Si desea pasar la cadena cuando regrese de una actividad, a continuación, utilizar startActivityForResult e implementar el onActivityResult caso
    http://micropilot.tistory.com/1577

  3. La tercera escenario, pasando la cadena entre dos las actividades que se ejecutan al mismo tiempo no son posibles porque solo se puede ejecutar una actividad (estar en primer plano) a la vez.

0

¿Se supone que su aplicación para ser multi threading? Si es así, eso abre una gran cantidad de gusanos y el análisis de los datos de un lado a otro se convierte en un malabarismo bastante interesante.

¿Has analizado las funciones putextra y getextra? Trabajan muy bien los datos de análisis entre las actividades. Aunque no creo que funcionen bien con aplicaciones de múltiples subprocesos.

1

A veces, las intenciones se vuelven demasiado engorrosas y molestas, en su lugar utilizo un patrón de diseño más fácil (quizás no óptimo): el Singleton. Un singleton funciona como un cuadro de almacenamiento común accesible por código que se encuentra en cualquier lugar de la aplicación, donde los valores se almacenan mientras el ciclo de vida de la aplicación está activo. También puedes poner métodos allí. Un singleton es una clase que solo se puede crear una instancia una vez y se puede usar como su almacén integral para todas las variables a las que necesita acceder desde cualquier lugar. Puedes establecer/obtener cualquier variable en el singleton de cualquier actividad o clase, ¡incluso contexto! Como dije tal vez hay mejores opciones, pero no tengo tiempo para castigarme con intenciones, punteros nulos y otras cosas. Crea una clase nueva con el siguiente código, llámala mySingleton o lo que sea, ¡y comienza a configurar/obtener variables de todas partes!:

public class MySingleton extends Application{ 
    private volatile static appSingleton mInstance = null; 
    private String mystring; 

private appSingleton(){ 
    mystring="hello"; //initialize your var here 
    //Add all the variables you need, here. 
public static MySingleton getInstance(){ //Singleton's core 
     if(mInstance == null){ 
      mInstance = new MySingleton(); 
      } 
     return mInstance; 
     } 

//Place Set and Get methods here 
public String getMystring(){return this.mystring;} 
public void setMystring(String s){mystring = s;} 
//Add get/setmethods for your other variables here 
} //Thats it 

Ahora, digamos que usted desea establecer mystring a "adiós" en la actividad B, entonces no desee hacer esto:

MySingleton.getInstance().setMystring("hello"); 

Si desea acceder a "mystring" de cualquier otra actividad, clase, etc ... y lo mostrará en un cuadro de texto acaba de hacer esto:

MyTextBox.setText(MySingleton.getInstance().getMystring()); 

Como se puede ver, se puede escribir valores en cualquier lugar y leer esos valores desde cualquier lugar, con una sola línea de código. ¡Disfrutar!

+0

En 'MySingleton.getInstance(). setMystring (" hello ");' que es donde se menciona para establecer la cadena para 'adiós', creo que debería ser 'MySingleton.getInstance(). setMystring (" adiós ");'. Intenté esto pero mi cadena no cambia a 'adiós', sigue siendo' hola'. –

+0

@KamalpreetGrewal ese valor "hola" solo sobrevivirá durante el ciclo de vida de la aplicación, eso significa que si cierra la aplicación o si el sistema operativo Android mata su aplicación, ese valor desaparecerá. Use las preferencias compartidas para que la cadena permanezca "permanentemente". – Josh

Cuestiones relacionadas