Передача строк между действиями в Android - PullRequest
9 голосов
/ 05 января 2012

Я искал довольно много мест, но я не нашел ни одного хорошего решения, которое бы сработало, и мне действительно нужна помощь!Я делаю приложение, которое должно передать строку долготы и широты от одного действия к другому.Как я могу это сделать???Взгляните на мой код здесь: LocationActivity.java должен передать строку другому действию и другому, в которое я не вставил сюда.И строка, которую нужно передать, называется: "latLongString"

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


}

Другая активность:

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

}

Ответы [ 4 ]

35 голосов
/ 05 января 2012

В вашем классе LocationActivity:

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

В классе FindAndroidActivity

Bundle extras = getIntent().getExtras();
if(extras !=null) {
    String value = extras.getString("KEY");
}
9 голосов
/ 05 января 2012

Пара сценариев:

  1. Если вы хотите передать строку при запуске нового действия, затем добавьте ее в начальное намерение и извлеките ее в новом действии onCreate.
    Отправка массивов с помощью 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. Если вы хотите передать строку при возврате из действия, используйте startActivityForResult и реализуйте событие onActivityResult
    http://micropilot.tistory.com/1577

  3. В третьем сценарии передача строки между двумя действиями, выполняющимися одновременно, невозможна, поскольку одновременно может выполняться только одно действие (находиться на переднем плане).

1 голос
/ 27 июня 2014

Иногда Intents становятся слишком громоздкими и раздражающими, вместо этого я использую более простой (возможно, не оптимальный) шаблон проектирования: Singleton. Синглтон работает как общий ящик для хранения, доступный для кода, который находится в любом месте вашего приложения, где значения хранятся, пока активен жизненный цикл приложения. Вы также можете поместить методы там. Singleton - это класс, который может быть создан только один раз и может использоваться в качестве единого хранилища для всех переменных, к которым вам нужен доступ из любого места. Вы можете установить / получить любую переменную в синглтоне из любого вида деятельности или класса, даже из контекста! Как я уже сказал, возможно, есть лучшие варианты, но у меня нет времени наказать себя намерениями, нулевыми указателями, а что нет. Создайте новый класс со следующим кодом, назовите его mySingleton или любым другим, и начинайте устанавливать / получать переменные отовсюду!:

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

Теперь, допустим, вы хотите установить mystring на "до свидания" в Деятельности B, а затем хотите сделать это:

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

Если вы хотите получить доступ к «mystring» из ЛЮБОГО другого вида деятельности, класса и т. Д. И отобразить его в текстовом поле, просто сделайте это:

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

Как видите, вы можете записывать значения в любом месте и читать эти значения из любого места с помощью одной строки кода. Наслаждайтесь!

0 голосов
/ 05 января 2012

Ваше приложение должно быть многопоточным? Если так, то это открывает целую другую банку с червями и анализом данных взад и вперед, становится довольно интересным жонглированием.

Вы изучили функции putextra и getextra? Они отлично работают при разборе данных между действиями. Хотя я не думаю, что они хорошо работают с многопоточными приложениями из коробки.

...