I'm currently developing an android application that makes use of Google Places API.
I have 2 activities that I want to pass a variable between. I have tried passing by Intent using putExtras and getExtras.
I have been having issues with the getExtras. I have debugged my code, used breakpoints and an output of the variable to the log.
Here is my code for the activity of which I want to pass the variable from:
Intent mapIntent = new Intent(getBaseContext(), MapsActivity.class);
Spinner distanceSpinner = (Spinner) findViewById(R.id.spinner_distance);
String radius = distanceSpinner.getSelectedItem().toString();
mapIntent.putExtra("radius", radius);
Log.e("Passer", String.valueOf(radius)); //Shows that value is not = null.
startActivity(mapIntent);
The log out put for this class is correct and displays the variable.
Here is the code for my class that I want to pass the variable to:
Intent filterIntent = new Intent(getBaseContext(), LocateFilterActivity.class);
Bundle bd = filterIntent.getExtras();
String radius= (String) bd.get("radius");
Log.e("TESTER", String.valueOf(radius));
startActivity(placeIntent);
The log does not actually output anything for this class. I know it can reach and execute the line of code through debugging.
I have tried coding this several different ways following previous SO questions/answers but not having much luck.
Any help would be much appreciated :)
You can access data which were passed to an activity with getIntent().getExtras() method which you can call in a newly created activity that you have created with startActivity(intent) call. :)
Related
This is a real noob question I'm sure, but I am finding it quite perplexing.
Why an earth would you want to ever use intent.putExtra method to share information between classes in Android?
Let me explain. I am making my first Android app following the instructions from the developers guide (I am already at a moderate level with Java) and I am using some code that looks like this:
//Class field
//key holds string????? not fully understanding this...
public static final String EXTRA_MESSAGE = "self.anon.myfirstapp.MESSAGE";
//this method is activated by a button being pressed
public void sendMessage(View view) {
Intent intent = new Intent(this,DisplayMessageActivity.class);
EditText editText = (EditText) findViewById(R.id.edit_message);
String message = editText.getText().toString();
//puts string message inside the string EXTRA_MESSAGE - why????
intent.putExtra(EXTRA_MESSAGE, message);
startActivity(intent);
}
OK firstly I want to point out I see what is happening and for the most part how it works (am just confused by the field declaration = "myClassPath" why?)...
BUT....
Surely it would be easier just to have a static field called:
public static String message;
then my method would look like this:
public void sendMessage(View view) {
Intent intent = new Intent(this,DisplayMessageActivity.class);
EditText editText = (EditText) findViewById(R.id.edit_message);
message = editText.getText().toString();
startActivity(intent);
}
Then when my class DisplayMessageActivity needs the string message he just calls for:
String message = myClass.message;
That seems so much more straight forward. What is with the creation of the new string EXTRA_MESSAGE which just seems to hold the string message and why send it with the intent when my other class can access this info directly anyway -- and what does the field declaration with the "self.anon.myfirstapp.MESSAGE" mean? I can find no such folder or path leading to anything.
As someone else stated there are often situations (such as a screen rotate) in which the android system destroys and restarts the app - so all variable data is lost. It would only work consistently the way you suggest if your data is hard coded as a final variable. That is not the only reason for using intents though.
The great thing with using an intent to pass information is that you can use the intent not just to communicate with sub-activities within your own application but to any activity installed on that android system. For example you may want to launch an intent which starts the phone application and include as an extra the number that you want to call.
Perhaps a better question than yours though is "why would you not use intents to pass information?" The intent.putExtra() method allows you a convenient flexible and straight forward method to pass as much information as you like in a safe and secure way to any other activity.
intent.putExtra(EXTRA_MESSAGE, message);
works like a key value pair, when you want to retrieve the information from the intent you can simply do intent.get<type>Extra and get said information, in this case, intent.getStringExtra("self.redway.myfirstapp.MESSAGE'). its simply the key to retrieve the information, it does not have to be your entire classpath.
it could just as easily be intent.putExtra("message",message).
They are helpful when passing information that you don't necessarily want to reveal to another class but you do want it to be able to get that information in another manner from what i have found.
message = myClass.message It is not always certain that this will retain its value especially when it extends Android framework classes like Activity. When your activity is recreated(change of screen orientation) then message can lose its current value and be assigned a default value. myClass.message would work if message was a static field or else you would need to provide getter and setter methods for object of the Activity Class. Well creating objects of activity class is unheard of in my experience.
The issue I encountered is really interesting for me. I develop an application using the Master Details template. On tablet everything works fine, but when switch to phone here I get something that I am not sure how to approach. After I select an item I launch an intent with the following code:
Intent detailIntent = new Intent(this, CategoryDetailActivity.class);
detailIntent.putExtra(CategoryDetailFragment.ARG_ITEM_ID, id);
startActivity(detailIntent);
and the problem is that I can't get the value of that id from the destination fragment:
if (getArguments().containsKey(ARG_ITEM_ID)) {
_locations = _sqlLoc.getAllLocationsByCategory(getArguments().getInt(ARG_ITEM_ID, -1));
}
else{
_locations = _sqlLoc.getAllLocationsByCategory(-1);
}
With this code I always get -1 instead of the real value. Can someone help me with this issue?
Why do you start a new Activity? You should just replace your current Fragment with the new one if you want to implement the phone version of Master-Details pattern correctly. Something like this: getFragmentManager().beginTransaction().replace(R.id.main_layout, new DetailsFragment()).addToBackStack(null).commit();
You can store any data you need in Activity and get it via (MyActivity)getActivity().getData() from your fragments. This way you don't need to pass any data via Bundle at all.
am trying to pass an arrylist from one intent to another.
My code is as follows:
intent.putExtra("near_places", nearPlaces);
intent.putExtra("nearby", nearbylist);
and at the new intent i do this:
nearPlaces = (PlacesList) extras.getSerializable("near_places");
nearbylist = (ArrayList<FsqVenue>)extras.getArrayList("nearby");
the code for the firat is correct but for the second it shows me errors where fsqVenue is a class
please help me
first make sure FsqVenue class implements Serializable interface then use this code for getting ArrayList in other Activity :
nearbylist = (ArrayList<FsqVenue>)extras.getSerializable("nearby");
In your receiving intent you need to do:
Intent i = getIntent();
near_places = i.getStringArrayListExtra("nearPlaces");
that's perfect work please try and give replay.
Princewill, here is your answer :- I want to let user add multiple items by action sequence, i have done this and looking for to make it more advanced.....JUST OPEN LINK AND VIEW code for Catalogue and SingleMenuItem Activity and done.
This question already has answers here:
Closed 11 years ago.
Possible Duplicate:
How do I pass data between activities in Android?
I have been banging my head across the table for days trying to figure this out. I'm new to both Java and the Android platform and I am writing my second application. In a nutshell, I want the user to enter in some information in the first activity. That activity then takes those inputs and runs a series of mathematical computations and then displays the results in several editTexts in a separate activity. In my mind, the application takes the input, runs the computations and then stores them in some variables. The variables then need to be passed to the second activity which then displays the results. I have most of the application coded and I can get it to work properly if I keep the inputs and displayed results in one activity. Any Ideas on how I can get the displayed results to show up on another activity? Any direction here is much appreciated.
This can be done with use of intent. one of the use of Intent is to pass the data between activities. In your scenario what you need to do is
STEP 1
After taking input from the user, do computation, store result in
the variables
bundle that in the intent which you are using to
start next activity. You can achieve this by below code
Intent intent = new Intent();
intent.putExtra("KeyForResult1", <your variable>);
intent.putExtra("KeyForResult2",<your variable>);
startActivity(this, nextactivity.class);
in the nextactivity you need to get the intent and extract the values in the variable
which can be achieved
variabletype variable = getIntent().getExtras().get("KeyForResult1");
variabletype variable = getIntent().getExtras().get("KeyForResult2");
You can use this:
ActivityOne.class:
//compute the data and get the result here
//suppose results are,
int resultInt=24;
String resultString="abc";
Intent intent=new Intent(getApplicationContext(),ActivityTwo.class);
intent.putExtra("ResultInInteger",resultInt);
intent.putExtra("ResultInString",resultString);
startActivity(intent);
this will open ActivityTwo.class,where you can get the data like:
int resultInt=getIntent().getIntExtra("ResultInInteger");
String resultString=getIntent().getStringExtra("ResultInString");
I was able to figure it out with a mixture of data I had researched. It seems what finally worked was
int resultInt=24;
Intent myIntent = new Intent(CalPalActivity.this, ResultsActivity.class);
myIntent.putExtra("intVariableName", resultInt);
startActivity(myIntent);
in the first activity and
Intent mIntent = getIntent();
int intValue = mIntent.getIntExtra("intVariableName", 0);
in the second. Why it worked like this and kept giving me errors such as "the method getIntExtra(String, int) in the type Intent is not applicable for the arguments (String)" in the second activity I'll never know. Even the Quick-fixes didn't fix it (I just kept getting new errors). All in all, it's an expensive (5 hour +) but well learned lesson. All of your help was much appreciated. I was able to understand and learn a great deal more about the language. Thank you!
You should read up on Intents. You can store extras in an intent, much like URL parameters. If you use that intent to start your next activity, it will be able to extract the data from the intent's extras.
There are several options. For your task I'd choose passing the data in Intent's extras.
For all options read this
Here is an option.
In first Activity:
Intent yourNextActivityIn=new Intent(this,yourNextActivity.class);
yourNextActivityIn.putExtra("tag",valueToBePassed);
startActivity(yourNextActivityIn);
In second Activity:
//If value is an Integer with default value 1
int value = getIntent().getIntExtra("tag", 1);
else
//if value is a string
String value = getIntent().getStringExtra("tag");
Im going a little crazy with this. In my app, i take a string which represents a bus stop, and then have an algorithm that matches it and displays its schedule. I needed to make that window an activity instead of a dialog and am using intents. Heres my code to send the intent:
Intent intent = new Intent(context, StopDialogActivity.class);
intent.putExtra("stop name", stopName);
context.startActivity(intent);
and heres my code to retrieve the string (in my onCreate):
Bundle extras = getIntent().getExtras();
departureStopName=extras.getString("stop name");
The string displays properly, but it isnt equal to a test string i have which is the same stop. The intent sends an integer over correct, what am i doing wrong with processing strings?
Make sure when comparing strings to use testName.equals(stopName) and not testName == stopName.
Using .equals() uses the equals method in the String class which compares the content. Using == compares the String Objects themselves, which need to be the same object in memory to evaluate to true.
Ah, my problem was while I use .equals() as a test to see if it was coming through okay, i was using == in the part of my code that broke.