2012-01-05 16 views
9

Przeszukałem sporo miejsc, ale nie mam żadnego dobrego rozwiązania, które działało jeszcze i naprawdę potrzebuję pomocy! Tworzę aplikację, która musi przekazywać ciąg długości i szerokości geograficznej od jednej aktywności do drugiej. Jak mogę to zrobić? Spójrz na mój kod tutaj: The LocationActivity.java musi przekazać ciąg do innego działania i do innego, którego nie wkleiłem tutaj. I ciąg znaków, który musi zostać przekazany został nazwany: "latLongString"Przekazywanie ciągów między działaniami w Androidzie

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


} 

Inna działalność:

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

Należy użyć putExtra() i funkcje getExtras() (lub getString) z zamiarem klasy tutaj odpowiedzi: [PutExtra/GetExtra] [1] [1]: http: // stackoverflow. com/questions/5265913/how-to-use-putextra-and-getextra-for-string-data –

Odpowiedz

33

W swojej klasie LocationActivity:

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

W klasie FindAndroidActivity

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

Kilka scenariuszy:

  1. Jeśli chcesz przekazać ciąg znaków podczas rozpoczynania nowej działalności, dodaj go do początkowego celu i pobierz go w nowej aktywności 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. Jeśli chcesz przekazać ciąg po powrocie z działalności, a następnie użyć startActivityForResult i wdrożyć zdarzenie
    http://micropilot.tistory.com/1577

  3. onActivityResult 3. scenariusz, przekazując ciąg między dwoma Działania uruchomione w tym samym czasie nie są możliwe, ponieważ tylko jedna czynność może być uruchomiona (być na pierwszym planie) w tym samym czasie.

0

Czy aplikacja ma być wielo gwintów? Jeśli tak, to otwiera zupełnie inną puszkę robaków i przetwarzanie danych tam iz powrotem staje się dość interesującą żonglerką.

Czy zapoznałeś się z funkcjami putextra i getextra? Pracują wspaniale podczas analizowania danych między działaniami. Chociaż nie sądzę, że te działają dobrze z wielowątkowymi aplikacjami po wyjęciu z pudełka.

1

Czasami intencje stają się zbyt kłopotliwe i denerwujące, zamiast tego używam łatwiejszego (może nie optymalnego) wzoru projektu: Singleton. Singleton działa jak zwykłe pudełko do przechowywania dostępne przez kod umieszczony w dowolnym miejscu aplikacji, gdzie wartości są przechowywane, gdy cykl życia aplikacji jest aktywny. Możesz tam również umieścić metody. Singleton to klasa, która może być utworzona tylko jeden raz i może być używana jako magazyn jednego przystanku dla wszystkich zmiennych, do których musisz mieć dostęp z dowolnego miejsca. Możesz ustawić/pobrać dowolną zmienną na singleton z dowolnej aktywności lub klasy, nawet kontekstu! Jak już powiedziałem, być może są lepsze opcje, ale nie mam czasu na karanie się intencjami, wskaźniki zerowe, a co nie. Utwórz nową klasę za pomocą następującego kodu, nazwij go mySingleton lub cokolwiek innego i zacznij ustawiać/pobierać zmienne z dowolnego miejsca!:

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 

Teraz, powiedzmy, że chcesz ustawić mystring na "do widzenia" na działalność B, a następnie chcę, aby to zrobić:

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

Jeśli chcesz uzyskać dostęp do "mystring" z jakiegokolwiek innego aktywny, klasa, itp ... i wyświetlić go na pole tekstowe po prostu to zrobić:

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

Jak widać, można napisać wartości gdziekolwiek i czytać te wartości z dowolnego miejsca, z jednej linii kodu. Cieszyć się!

+0

W 'MySingleton.getInstance() .setMystring (" hello ");' to jest miejsce, o którym wspomniałeś, aby ustawić ciąg znaków "do widzenia", myślę, że powinno to być 'MySingleton.getInstance(). setMystring (" do widzenia ");'. Próbowałem tego, ale mój ciąg nie zmienia się na "do widzenia", pozostaje "cześć". –

+0

@KamalpreetGrewal, że wartość "cześć" przetrwa tylko przez cykl życia aplikacji, co oznacza, że ​​jeśli zamkniesz aplikację lub system operacyjny Android zabije twoją aplikację, ta wartość zniknie. Użyj sharedpreferences, aby ciąg pozostał "trwale". – Josh

Powiązane problemy