Home » Android » Passing strings between activities in android

Passing strings between activities in android

Posted by: admin May 14, 2020 Leave a comment

Questions:

I have searched quite a few places but i haven’t got up with any good solution that worked yet, and i really need help!
I am making an application that needs to pass a longitude and latitude string from one activity to another.
How can i do this??? Take a look at my code here: The LocationActivity.java needs to pass the string to the other activity and to another one that i didn’t paste into here. And the string that needs to be passed is named: “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) {
    }
};


}

The other activity:

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

}

How to&Answers:

In your LocationActivity class:

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

In FindAndroidActivity class

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

Answer:

Couple of scenarios:

  1. If you want to pass the string when you start the new activity, then add it to the starting Intent and retrieve it in the new activity’s 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. If you want to pass the string when you return from an activity, then use startActivityForResult and implement the onActivityResult event
    http://micropilot.tistory.com/1577

  3. The 3rd scenario, passing the string between two activities running at the same time is not possible because only one activity can run (be in the foreground) at a time.

Answer:

Sometimes, Intents become too cumbersome and annoying, instead I use an easier (maybe not optimal) design pattern: the Singleton.
A singleton works like a common storage box reachable by code that sits anywhere in your app, where values are stored while the app’s lifecycle is active. You can also put methods there.
A singleton is a class that can only be instantiated once, and can be used as your one stop warehouse for all the variables that you need to access from everywhere. You can set/get any variable on the singleton from any activity or class, even context!
As I said maybe there are better options, but I don’t have the time to be punishing myself with intents, null pointers and what not.
Create a new class with the following code, call it mySingleton or whatever, and start setting/getting variables from everywhere!:

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

Now, lets say you want to set mystring to “goodbye” on Activity B, then do want to do this:

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

If you want to access “mystring” from ANY other Activity, class, etc… and display it on a textbox just do this:

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

As you can see, you can write values anywhere and read those values from anywhere, with a single line of code. Enjoy!

Answer:

Is your application supposed to be multi threading? If so that opens a whole other can of worms and parsing data back and forth becomes a quite interesting juggle.

Have you looked into the putextra and getextra functions? They work great parsing data back and forth between activities. Though I don’t think those work well with multi threaded applications out of the box.