Store intent for one activity but start a different activity - java

I am new to android and I have a problem. I want to store intent for an activity but start a different activity. I have a backgroundworker activity that has to store intent for postAnnotationActivity, but has to start InstructionsActivity. If I use intentID.getStringExtra in PostAnnotationActivity then the output = null. Can somebody help?
Part of code from Backgroundworker:
Intent intent = new Intent(context, InstructionsActivity.class);
Intent intentID = new Intent(context, PostAnnotationsActivity.class);
intentID.putExtra(ID, id);
context.startActivity(intent);
part of PostAnnotationActivity:
Intent intentID = getIntent();
String getID = intentID.getStringExtra(BackgroundWorker.ID);
From InstructionsActivity I'll go to StartActivty using startActivity(new Intent(this, ShowPaintingActivity.class)and then to PostAnnotationActivity using startActivity(new Intent(this, PostAnnotationsActivity.class));

Try storing your Intent instead as a string and use shared preferences to store/retrieve your Intent. Like so.
SharedPreferences prefs = this.getSharedPreferences("myPrefsKey", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putString("StoredIntent", "String you want to store here");
editor.commit();

Modify your code as following:
In Backgroundworker:
Intent intentID = new Intent(context, InstructionsActivity.class);
intentID.putExtra("ID", id);
context.startActivity(intentID);
In InstructionsActivity:
Intent intentID = getIntent();
String getID = intentID.getStringExtra("ID");
Intent intent = new Intent(context, ShowPaintingActivity.class);
intent.putExtra("ID", getID);
context.startActivity(intent);
In ShowPaintingActivity:
Intent intentID = getIntent();
String getID = intentID.getStringExtra("ID");
Intent intent = new Intent(context, PostAnnotationActivity.class);
intent.putExtra("ID", getID);
context.startActivity(intent);
In PostAnnotationActivity:
Intent intentID = getIntent();
String getID = intentID.getStringExtra("ID");
And another better solution is, as user1375469 suggested, you can save value to preferences in Backgroundworker and then retrieve it from PostAnnotation Activity.

Your are getting the output null because you are not starting the Activity i.e.
context.startActivity(intentID);
while you are passing the data into it..
and you want to go to my InstuctionsActivity but already store some data from BackgroundWorker for PostAnnotationActivity....
So, you have to use SharedPreference for this purpose....

Related

intent.putExtra() and intent.getStringExtra() are not working. getStringExtra returns null

intent.putExtra() and intent.getStringExtra() are not working. getStringExtra returns null
At sending side:
Intent intent = new Intent(getApplicationContext(), ChooseUserActivity.class);
startActivity(intent);
intent.putExtra("Name",imageName);
At receiving side:
Intent secondIntent = getIntent();
String nameImage = "Something " + secondIntent.getStringExtra("Name");
Log.i("Name of the Image: ",nameImage);
The output of the Log cat:
You should first put Extras in Intent and then start activity not after it
//create intent
Intent intent = new Intent(getApplicationContext(),ChooseUserActivity.class);
//put extras
intent.putExtra("Name",imageName);
//start activity
startActivity(intent);

Android Studio: How to send, and recieve a Class in diferent Activities

Im making a quiz game with questions on diferent topics
For Example i have activities for these topics: Flags, Capitals, Population, Economy, Continent, etc.
And i have one single ResultActivity to obtain the Score of the quiz.
The ResultActivity has a PLAY AGAIN button.
On the FlagsActivity i have this code:
Intent intent = new Intent(getApplicationContext(),ResultActivity.class);
intent.putExtra("RIGHT_ANSWER_COUNT", score);
intent.putExtra("NAME_ACTIVITY", "FlagsActivity");
startActivity(intent);
On the CapitalActivity i have this code:
Intent intent = new Intent(getApplicationContext(),ResultActivity.class);
intent.putExtra("RIGHT_ANSWER_COUNT", score);
intent.putExtra("NAME_ACTIVITY", "CapitalActivity");
startActivity(intent);
etc.....
On the ResultActivity i have this code:
activity = getIntent().getStringExtra("NAME_ACTIVITY");
public void playAgain(View view){
if(activity.equals("FlagsActivity")){
Intent intent = new Intent(getApplicationContext(), FlagsActivity.class);
startActivity(intent);
}
if(activity.equals("CapitalActivity")){
Intent intent = new Intent(getApplicationContext(), MainActivity.class);
startActivity(intent);
}
if(activity.equals("PopulationActivity")){
Intent intent = new Intent(getApplicationContext(), PopulationActivity.class);
startActivity(intent);
}
if(activity.equals("EconomyActivity")){
Intent intent = new Intent(getApplicationContext(), EconomyActivity.class);
startActivity(intent);
}
if(activity.equals("ContinentActivity")){
Intent intent = new Intent(getApplicationContext(), ContinentActivity.class);
startActivity(intent);
}
}
Basically im sending an Intent with a String containing the name of the activity, then on the Result Activity evaluating with "if" the String = That activity name, start the activity.
What i want to do is someting like this:
On the Flags Activity:
Intent(getApplicationContext(),ResultActivity.class);
intent.putExtra(FlagsActivity.class);
startActivity(intent);
On the CapitalActivity:
Intent(getApplicationContext(),ResultActivity.class);
intent.putExtra(CapitalActivity.class);
startActivity(intent);
On the Result Activity:
activity = getIntent();
public void playAgain(View view){
Intent intent = new Intent(getApplicationContext(), activity);
startActivity(intent);
}
So that i can create as many quiz activities without having to create an "if" statement on the ResultActivity for it to work.
You can pass the class name as a string and use reflection to look up a class object for that type. Something like this:
Class classToLoad = Class.forName(getIntent().getStringExtra("NAME_ACTIVITY"));
Intent intent = new Intent(getApplicationContext(), classToLoad);
startActivity(intent);
I would pass the fully qualified class name to avoid errors.
You could pass the String of activity name to the Result activity, and get its corresponding class name using reflection:
String strActivity = "com.package.FlagsActivity";
Intent intent = new Intent(getApplicationContext(),ResultActivity.class);
intent.putExtra("activity_name", strActivity );
startActivity(intent);
String activityName = getIntent().getStringExtra("activity_name");
Class<?> myClass = Class.forName(activityName );
Intent myIntent = new Intent(getApplicationContext(), myClass);
Something like this.
In the Results Activity
public static void toActivity(Context context, final Class ActivityToOpen){
//whatever awesome code you would like to perform
Intent intent = new Intent(context, ActivityToOpen);
startActivity(intent);
}
In the originating Activity (Flags Activity for example)
ResultsActivity.toActivity(FlagsActivity.this, FlagActivity.class);
Check for typos... I kinda winged this :)
You should be able to call from any originating Activity without if statement.
When you receive the data
String activity;
Bundle bundle = getIntent().getExtras();
if (bundle != null){
activity = bundle.getString("NAME_ACTIVITY");
}

Passing data from one activity to another and then printing

The problem I am having is that it prints out Null on the second activity and not the actual username that is entered. Is the data being passed to the second activity correctly? Does the second activity need more code? Sorry but not the best at programming.
I have this code in my main class
if (username.getText().toString().equals("batman") &&
password.getText().toString().equals("Joker")) {
Toast.makeText(MainActivity.this, "Username and
password is correct", Toast.LENGTH_SHORT).show();
Intent intent = new Intent("com.example.*******.loginpage.User");
intent.putExtra("username",String.valueOf(username));
startActivity(new Intent(MainActivity.this, User.class));
This is the code inside my second class.
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_user);
Intent intent = getIntent();
String username = getIntent().getStringExtra("username");
TextView textView = (TextView) findViewById(R.id.textView4);
textView.setText("Welcome" + " " + username );
The problem is your intent in your first class
Intent intent = new Intent("com.example.*******.loginpage.User"); <-- have created an intent
intent.putExtra("username",String.valueOf(username));
startActivity(new Intent(MainActivity.this, User.class)); <-- but using new Intent
You have created an intent but you passing new intent. Use your created Intent instead of passing new Intent.
Intent intent = new Intent(MainActivity.this, User.class);
intent.putExtra("username",String.valueOf(username));
startActivity(intent);
EDIT
Instead using String.valueOf(username) you must use username.getText(), because String.valueOf(username) is method to translate your object to String.
Intent intent = new Intent(MainActivity.this, User.class);
intent.putExtra("username",username.getText());
startActivity(intent);
Two problems here.
First one is that you have to pass the intent where you put your extra instead of creating new one to startActivity, like
Intent intent = new Intent(MainActivity.this, User.class);
intent.putExtra("username",username.getText().toString());
startActivity(intent);
Second problem is that username looks like editText, String.valueOf won't pass actual value, use username.getText().toString() like i mentioned in code.

Copy intent / change source activity and destination class

I want to change to a new Activity over an Intent, but in my current Intent there are all my ExtraStrings as parameters. So decided to copy it with
Intent next = getIntent();
but how to change the source activity and the destiantion class now ?
Probably the better solution would be create your own Intent with your destination class and use Intent.putExtras(Intent src) to put extra data of original intent to new one.
And of course you can use Intent.setClass or setClassName() just to replace destination class.
You can also pass your data in bundle..
FirstActivity:
Intent mIntent = new Intent(this, activity1.class);
Bundle mBundle = new Bundle();
mBundle.putString("key", "value");
mIntent.putExtra("keyBundle", mBundle);
SecondActivity:
Intent mIntent = new Intent(this, activity2.class);
mIntent.putExtras(getIntent().getExtras().getBundle("keyBundle"));

Passing extra data from an Activity to an Intent

I am calling an Activity using an Intent, and I need to pass variables to that Activity when is initialized. On iOS you can use a custom initialization using the initWithNibName method. How can a similar thing be achieved on Android?
Here is my code that creates an Intent...
Intent myIntent = new Intent(webPush.this, webPushActivity.class);
startActivity(myIntent);
Intent myIntent = new Intent(webPush.this, webPushActivity.class);
myIntent.putExtra("mystring",strValue)' <<---put String here
startActivity(myIntent);
and in second Activity...
String str = getIntent.getExtras().getString("mystring");<<get string in second class
and check this
How do I pass data between Activities in Android application?
You can put extra data into the Intent...
myIntent.putExtra("exampleString","This is some extra data");
myIntent.putExtra("exampleNumber",1234);
When you call the Intent, it starts the Activity. in one of the main methods of the Activity, like onCreate(), you can access the Intent and get the extras from it, like so...
Intent callingIntent = getIntent();
String exampleString = callingIntent.getStringExtra("exampleString");
int exampleNumber = callingIntent.getIntExtra("exampleNumber");
You can set extras to the intent:
myIntent.putStringExtra("First key", 1);
myIntent.putStringExtra("Second key", "some string");
And then get it in the new activity
Int extraInt = getIntent().getIntExtra("First key");
String extraString = getIntent().getStringExtra("Second key");
See more in the Intent docs
This can be done with intent extras. For example:
int variable = 6;
Intent myIntent = new Intent(webPush.this, webPushActivity.class);
myIntent.PutExtra("stringLabel", variable);
startActivity(myIntent);

Categories

Resources