I am on page 301 of this book and it is an example of an Activity getting "extras" from the intent that started it. I am fairly new to Java so maybe am missing something pretty obvious but...
I thought that when you declare a variable as "final" it meant that it doesn't change.
There is a line of code initialising a final variable:
public static final String EXTRA_MESSAGE="msg";
and then later in onCreate method:
tv.setText(getIntent().getStringExtra(EXTRA_MESSAGE));
The text displayed in the activity is not "msg" but is the string passed from the intent "I am the other activity". Why do you have to have the variable declaration above for the code to work? I don't understand what its doing.
Thanks
You are getting the extra received from another Activity indexed by the key 'msg'.
Like when you do this with the Intent used to start your Activity:
intent.putExtra("msg", "text going in the TextView");
The key is 'msg', but the value you get for the TextView is 'text going in the TextView'
Yes, final means EXTRA_MESSAGE value won't change, but you're not displaying EXTRA_MESSAGE value, but
getIntent().getStringExtra(EXTRA_MESSAGE)
which actually contains the value put in the previous activity. Regarding your question
Why do you have to have the variable declaration above for the code to work?
You don't actually need that variable for the code to work, but it's a good practice to use constant values instead of just hardcoding string values such in.-
getIntent().getStringExtra("msg")
The parameter you pass to getStringExtra is the key to which the String is mapped. All the extras you put in an Intent are mapped as key-value, so if you want to get a value you have to know the key, which must be the same key you used in the previous activity to save the value (with putStringExtra).
http://developer.android.com/reference/android/content/Intent.html#getStringExtra(java.lang.String)
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.
All
I'm new to Android, but have some Java experience.
I'm working through the standard lessons, and I've created the 2 basic Activities with the EXTRA_MESSAGE String passing between the activities and being displayed.
The content of the first Activity is static and declared in the layout file. The content of the second Activity is dynamic ( based on the value entered in an EditText on the first Activity ) and is built in the onCreate() method in the second Activity.
Is is possible to define the dynamic content in the layout file ? Something like:
android:text="the value of EXTRA_MESSAGE in the Intent that is passed to this Activity" ?
I understand the lesson is showing me two ways of doing things, but is this do-able ?
I think you have mean this:
android:text="#string/EXTRA_MESSAGE"
You can also set the text programmatacly:
TextView myText = (TextView) findViewById(R.id.txt_mytext);
myText.setText("This value will be shown");
//Or if you defined a static string in another Activity
myText.setText(FirstActivity.stringName);
https://stackoverflow.com/a/2508138/1508448
Please go through the link above.
My compiler is showing a problem in REQ_CODE_PICK_IMAGE.
It asks if I need to create a variable. What is it?
//you need to create an variable in your class
public final static int REQ_CODE_PICK_IMAGE=1
switch(case)
case 1: //instead of hardcoding here you need to declare the variable as integer
break;
case 2;
.
.
EDIT:
When an activity exits, it can call setResult(int) to return data back to its parent. It must always supply a result code, which can be the standard results RESULT_CANCELED, RESULT_OK, or any custom values starting at RESULT_FIRST_USER. In addition, it can optionally return back an Intent containing any additional data it wants. All of this information appears back on the parent's Activity.onActivityResult(), along with the integer identifier it originally supplied.
I have an activity that has an EditText. After a user enters their text, the app may use that text later to make a notification. I can set the notification text just fine, but when the user clicks on the notification, it launches a dialog box that should have the same text. I have tried putExtra with the PendingIntent but that only displays the latest text in the dialog no matter which notification was selected. Is there a way to assign each string from the EditText a number and have the dialog load the text from what number it is?
try following logic,
make one static string variable,
private static strEditText = null;
at the time of EditText input, just store its value ion to strEditText variable like below,
strEditText = EditText.getText().toString().trim();
Now make one public static method, like below,
public static String EditTextValue()
{
return strEditText;
}
Now you can have this variable's value throughout whole project.
You can also try another method in android,
pass your arguments in Bundle
The PendingIntents are pooled/cached and the extra's don't make them different entries, so if you have a bunch of notifications with pendingIntents and the only difference between the intents are extras, then you'll end up with the notifications all using the one of the pendingIntents. [This sounds like what you're seeing, I remember this driving me nuts for a while]. You need to make your pending intents differ in something that the pool/cache cares about, like the data URI or action.
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.