How to pass String from 2 activities to one? - java

I have two activitys with lists.
One for tablet's and one for regular density phones.
When an item in the list is clicked it launches the same activity for either activity with list's.
The problem is when an item is clicked i have getter and setter class that gets the URL for a particular item and passes it to the launching activity like this...
private String URL = null;
try{
URL = com.fttech.AbstractFeedsActivity.feed_url;
}
catch(IllegalArgumentException e){
e.printStackTrace();
URL = com.fttech.ItemsActivity.url;
}
As you see what i tried to do is try and catch.
So if the first one isnt found then the second one will be retrieved.
But it doesnt seem to work.
It returns null each time.
For what i have describe what is the best way to implement this?
Is my way logic? Or is there a better way.
Thanks

Try this,
private String URL = null;
try{
URL = com.fttech.AbstractFeedsActivity.feed_url;
if(TextUtils.isEmpty(URL)){
URL = com.fttech.ItemsActivity.url;
// Pass this URL
}
else{
// If its not empty then it will pass the first URL
}
}
catch(IllegalArgumentException e){
e.printStackTrace();
}

No need to pass String to 2 activities, if you want to just pass strings to one or as many activities as you want, just put them in SharedPreferences or declare a variable in static class and then set/get it whenever you want.

Passing values from one Activity to another:
Intent intent = new Intent(context, CalledActivity.class);
intent.putExtra(key, value);
startActivity(intent);
If you want some data back from called Activity then you can use startActivityForResult() as:
Intent intent = new Intent(context, CalledActivity.class);
intent.putExtra(key, value);
startActivityForResult(intent, requestCode);
In called activity you can set data as:
setResult(RESULT_OK, intent);
Note: Here you set the value in intent and pass it to setResult().
On returning back to calling Activity you can get data by overriding:
#Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == RESULT_OK){
//Get data from Intent "data" and do your task here....
}
}
Note: You can pass primitive data type values thru Intent and if you want to pass other types then you have to use Bundle like this.
Bundle data = new Bundle();
data.putIntArray(key, value);
//same way you can set other values.......
//Now set this Bundle value to Intent as you do for primitive type....
Intent intent = new Intent(context, CalledActivity.class);
intent.putExtra(data);
startActivity(intent);
Receiving data in Activity:
//For primitive values:
DataType var_name = getIntent().getExtras().get(key);
//For Bundle values:
Bundle var_name = getIntent().getExtras().getBundle(key);

Related

Is there a way to check if I came from a specific activity before starting a new one?

Let's say I have 3 activities: A, B, and C. And all 3 activities can direct the user to one another. Is there a way to check if I came from a specific activity?
For example, to get to C, I can move from B -> C or A -> C. But is there a way for me to check if I came from B?
You can pass data payload through activity intent.pass your activity name for check where user came from.
start activity
Intent intent = new Intent(yourFromActivity.this,yourToActivity.class);
intent.putExtra(bundle_key,yourActivityName);
startActivity(intent)
In your second activity check intent extra and get the activity name where user came from.
#override
protected void onCreate(Bundle savedInstanceState){
//check extra key has in bundle.should same as host activity key
if(getIntent().hasExtra(bundle_key))
{
//get passed value from intent bundle
String activity = getIntent().getStringExtra(bundle_key,"");
if(activity.equel(yourActivityname)){
//put logic here
}
}
}
You can do it by 2 ways which are
Pass extra parameter in Intent when calling activity and in receiver
activity check received parameter and perform task accordingly.
Use startActivityForResult() instead of startActivity() when calling
activity & use getCallingActivity().getClassName() in receiver call to get
class name.
Passing Data in Intent:
Calling class A:
Intent intent = new Intent(A.this,C.class);
intent.putExtra("source","A");
startActivity(intent);
Receiver class C:
in onCreate method
String source;
Intent intent = getIntent();
if(intent.hasExtra("source"))
{
source = intent.getStringExtra("source");
}
//Now you received source class name you can check and perform action
//accordingly.
if(source.equals("A")
{
//For Class A
}
else{
// For Class B
}
Using startActivityForResult():
Sender Class:
Intent intent = new Intent(A.this,C.class);
startActivityForResult(intent);
Receiver Class:
//In onCreate Method get calling activity name
getCallingActivity().getClassName();
try this
Intent intent = new Intent();
intent.setClass(A.this,Receiveractivity.class);
intent.putExtra("Uniqid","From_Activity_A");
A.this.startActivity(intent);
Intent intent = new Intent();
intent.setClass(B.this,Receiveractivity.class);
intent.putExtra("Uniqid","From_Activity_B");
B.this.startActivity(intent);
Intent intent = new Intent();
intent.setClass(C.this,Receiveractivity.class);
intent.putExtra("Uniqid","From_Activity_C");
C.this.startActivity(intent);
Intent Activity
//obtain Intent Object send from SenderActivity
Intent intent = this.getIntent();
/* Obtain String from Intent */
if(intent !=null)
{
String strdata = intent.getExtras().getString("Uniqid");
if(strdata.equals("From_Activity_A"))
{
//Do Something here...
}
if(strdata.equals("From_Activity_B"))
{
//Do Something here...
}
if(strdata.equals("From_Activity_C"))
{
//Do Something here...
}
........
}
else
{
//do something here
}

Can the same Android getIntent() receive from two different classes?

Problem:
When I try to "reuse" so-to-speak a getIntent() with extra values by passing data to it from a second activity, the extra values return null. So I want to pass NoteAdapter Intent Extras to the ViewNote class and I also want to pass EditNote Intent Extras to the ViewNote class using the same string keys.
Something like this: User chooses note > User Views Note > User Edits Note > User Views Note corrected.
What works:
Based upon a user selection of a RecyclerView list of notes, the chosen note through a NoteAdapter has extra details passed to an Intent to a ViewNote class which in turn has a Intent n = getIntent() which these extras are received. Note details are loaded into the ViewNote activity. If the user decides this note needs corrected or updated, then the ViewNote class has an Intent that passes extras to the EditNote class. This all works great!
What doesn't work and What I'm trying to do:
I'm not sure whether this is allowed or can be done but I'm trying to pass extras back to the ViewNote class from the EditNote class using the same Intent n = getIntent() in the ViewNote class used earlier when a note was passed to it.
The ViewNote class getIntent():
Intent n = getIntent();
nNoteID = n.getIntExtra("ID", 0);
String nType = n.getStringExtra("Type");
String nSummary = n.getStringExtra("Summary");
String nSource = n.getStringExtra("Source");
String nAuthors = n.getStringExtra("Authors");
The EditNote Intent to pass extras back to the ViewNote
Intent u = new Intent(EditNote.this, ViewNote.class);
u.putExtra("ID", vNoteID);
u.putExtra("Type", ty);
u.putExtra("Summary", su);
u.putExtra("Source", so);
u.putExtra("Authors",au);
EditNote.this.startActivity(u);
What I have tried:
I've read a few posts here on stackoverflow that appeared to be similar and tried changing the context (thinking maybe that was wrong), and tried using Bundle but neither of those made any difference. I thought maybe the String array values weren't passing so I just passed String variables because the "ID" number as a String seems to pass fine but the other values still return null. I've read some of the Android Developer explanations about Intents and maybe I just don't understand Intents fully or maybe this just can't be done or is not how it should be done.
I'm working in the following:
Intellij Idea 2021.1.1
Java Android v.28 Min v.29 Max
Gradle 4.1.2
The solution was exactly what David Wasser posted in the initial comments above. I needed to use the startActivityForResult and follow the guidelines on how to do so. I did review the Android Development links and other examples online, but this video helped:
Android startActivityForResult Tutorial
These are the code segments in sequence:
ViewNote
menuIntent = new Intent(this, EditNote.class);
menuIntent.putExtra("NoteID", nNoteID);
menuIntent.putExtra("NoteDetails", new ArrayList<>(noteDetails));
if(noteFiles.size() > 0)
menuIntent.putParcelableArrayListExtra("NoteFiles", new ArrayList<>(noteFiles));
startActivityForResult(menuIntent, REQUEST_CODE); // REQUEST_CODE = 1
EditNote
Intent u = new Intent();
u.putExtra("ID", vNoteID);
u.putExtra("Type", ty);
u.putExtra("Summary", su);
u.putExtra("Source", so);
u.putExtra("Authors",au);
setResult(RESULT_OK,u);
finish();
Back to ViewNote onActivityResult
#Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == REQUEST_CODE){
if(resultCode == RESULT_OK) {
nNoteID = data.getIntExtra("ID", 0);
nType = data.getStringExtra("Type");
nSummary = data.getStringExtra("Summary");
nSource = data.getStringExtra("Source");
nAuthors = data.getStringExtra("Authors");
}
}
}

Why am I getting a null pointer exception when passing an ArrayList of strings from one activity to another?

I am trying to get an arraylist in ScanLocate activity from an UpdateLocation activity.
I'm using startActivityForResult method to call the scan method which populates the ArrayList wifiList, I then want to send the ArrayList to the Update Location class.
I start by calling startActivityForResult in Update Location:
private void getScan(){
//Create an intent to start ScanLocate
final Intent i = new Intent(this, ScanLocate.class);
//Start scanLocate with request code
startActivityForResult(i, REQUEST_READINGS);
}
Next, in ScanLocate I created the sendData method (note: the check confirms that the ArrayList data is intact at that point):
private void sendData(){
//create a new intent as container for the result
final Intent readings = new Intent(this, UpdateLocation.class);
//check that data is in wifiList
for(String s:wifiList){
Log.v(TAG,"List Items: " + s);
}
//create bundle for string array
Bundle b = new Bundle();
b.putStringArrayList(key, wifiList);
//add readings to send to updateLoc
readings.putExtras(b);
//set code to indicate success and attach Intent
setResult(RESULT_OK, readings);
//call finish to return
finish();
}
The final part is back in UpdateLocation with the onActivityResult:
#Override
public void onActivityResult(int requestCode, int resultCode, Intent readings){
super.onActivityResult(requestCode, resultCode, readings);
//check if request code matches the one set above
if(requestCode == REQUEST_READINGS){
//check if sendData() in ScanLocate was successful
if(resultCode == RESULT_OK){
//get the readings from the Intent
Log.v(TAG, "HERE");
result = getIntent().getExtras().getStringArrayList(ScanLocate.key);
Log.v(TAG, "HERE2");
for(String s : result) {
Log.v(TAG, "Location 5: " + s);
}
}else{
//ScanLocate was unsuccessful
}
}
}
The first "Here" is displayed however it then falls down on the next line, getStringArrayList() throws a null pointer exception.
I have looked through the documentation and at previous questions on here and I cannot see what is going wrong.
Any advice would be appreciated, thanks.
Previous questions:
startactivityforResult not working
How to pass an ArrayList to the StartActivityForResult activity
You don't need to call getIntent(), use the parameter provided by the method:
result = readings.getStringArrayListExtra(ScanLocate.key);

Can startActivityForResult() send data?

I am learning android and curious to know as if startActivityForResult() contains the properties of startActivity() too, i.e. can it be used to send data like startActivity() beside receiving data from called activity?
Here is the code:
SendData Activity:
Intent data= new Intent(SendData.this, RecieveData.class);
Bundle check = new Bundle();
check.putString("UmerData", cheese);
medt.setText(cheese);
data.putExtras(check);
startActivityForResult(data, 5);
Should receive data in this activity (RecieveData Activity)
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.recievedata);
Initializek();
Bundle got = getIntent().getExtras();
String ss= got.getString("UmerData");
if(getIntent()!=null && ss!=null ) {
rt1.setText("Is not Null");
}
}
Your help will be really appreciated !
Thanks
Yes, startActivity & startActivityForResult, both take intent as param. You can bundle launch data inside intent and pass it over to target activity.
When you use startActivityForResult(), you have to also create a onActivityResult() method within the Activity that called startActivityForResult(). onActivityResult() is where you can access the Intent stored by the Activity you start for a result.
In the Activity that is then started, you have to call setResult() to store the Intent that you store the data in.
Read over this: http://developer.android.com/reference/android/app/Activity.html#StartingActivities
edit: Misread your question. For passing a Bundle of options through, I would use this overload:
startActivity(Intent, int, Bundle)
I'm working in Xamarin Android so the code is C# but I had the same problem except I'm sending between separate apps. I eventually got it working so here is my example.
var intent = new Intent();
intent.SetComponent(new ComponentName("com.company.packageName", "com.company.packageName.activityName"));
intent.PutExtra(Intent.ExtraText, message);
StartActivityForResult(intent, 1);
// in app being started
protected override void OnResume()
{
base.OnResume();
Intent intent = Intent; // Equivalent to getIntent()
if (intent != null)
{
string str = intent.GetStringExtra(Intent.ExtraText);
if (str != null)
{
// Do stuff with str
}
else
{
//Show Error
}
}
else
{
//Show Error
}
}

Android: Passing data between activities - multiple intent.putExtra not working?

Having a very annoying problem with passing data between activities.
This is the code I use to successfully pass the value of a progress bar to a different activity:
public void WhenClicked(View view)
{
view.clearAnimation();
Intent intent = new Intent("com.android.Test.QUESTION");
if (progressBar != null)
{
if (progressBar.getProgress() != 0)
{
intent.putExtra("ProgressBarValue", progressBar.getProgress());
}
}
startActivity(intent);
}
Okay, so that worked. Now, when I change it to this, it blows up:
public void WhenClicked(View view, String category)
{
view.clearAnimation();
Intent intent = new Intent("com.android.Test.QUESTION");
intent.putExtra("Category", category);
if (progressBar != null)
{
if (progressBar.getProgress() != 0)
{
intent.putExtra("ProgressBarValue", progressBar.getProgress());
}
}
startActivity(intent);
}
I don't understand what the problem is. I've even tried sticking it all into a bundle and adding the bundle as an extra - that just made it crash as well. Maybe I'm being stupid and I've just been staring at my code too long, but any help would be great!
This is my first time with Android and it's killing me!
Thanks in advance guys!
first you need to create bundle object(Bundle bnd=new Bundle();) and next bnd.putString("param1", "test");
next create intent:
Intent myIntent = new Intent(current classname.this,nextactivity.class);
myIntent.putExtras(bnd);
startActivityForResult(myIntent, 0);
In 2nd activity u need to get bundel value like :
Bundle bundle = this.getIntent().getExtras();
String _getData=bundle.getString("param1");
Assuming that you have an activity called QUESTION, you might try to put .class on the end as well as "this" for first param:
Intent intent = new Intent(this, QUESTION.class);
if you don't have a QUESTION activity then that is another problem. I'm assuming your activities are in the same app?
I believe, the activity which should handle this intent action com.android.Test.QUESTION does not understand your category i.e intent.putExtra("Category", category);.
You can try fixing it in 2 ways:
If the receiving activity is from your own application, then try using explicit intent i.e Intent intent = new Intent("youCurrentClass","theClassYouWantToCall"); without feeding additional category, this will launch the specified activity. In case of explicit Intent Android system does not do a comparison with the intent-filters to match Intent Object.
Change the category section in relation to intent receiving Activity.
Hope this helps,
sku

Categories