I need a global TextView? - android

I have 2 classes - Buttons_Class - Display_Class
On the screen I show a few Buttons and a TextView at all times.
The Buttons class sends a startActivityforResult to the Display class with a string in a bundle. The Display class manipulates that string and shows something in a TextView. That is working fine.
In order to go back to the Buttons class the Display class sends back an Intent with a setResult. This is also working well.
But then Display class has to do a finish() and this erases the information in the TextView.
How can the information in a TextView be kept while many other activities start and stop?

"I need a global TextView?" - No you don't. Ever. (I know that's a strong word, but really)
A TextView is a user interface element. It should display a graphical representation of external data. You need to decouple the data model from the user interface. This can be done in a number of ways; probably the simplest is to store your data model in a singleton class that is accessible throughout the application. Your Activity classes should simply access the data and provide a visual representation of it.

Related

Handling input with Android Architecture Components

TL;DR
How do I deal with Activities that actively change data (for example through an EditText)? Do I keep saving their state in the SavedInstanceState on rotation and only use the ViewModel when all of the fields are ready, or is there a way to make the ViewModel responsible for checking/holding/using the UI's data?
Question
I'm developing my application using Google's Arch. Components, and writing my latest class I've noticed I'm not really sure on what the best practice is when handling, say, data coming from an Activity form.
Example
I have a POJO made of title, description, location, type
I have an Activity with four EditText: title_et, description_et, location_et, type_et.
My ViewModel, through a Repository (irrelevant here), can send an object to the Database when the sendObject function is called.
How I'm doing it now
The activity has the mTitle, mDescription, mLocation, mType.
On rotation, the activity saves all of the EditText values in the savedInstanceState bundle, and it loads them again populating the views.
When the user wants to send the object, it clicks a button and the activity calls the function viewModel.sendObject(mTitle, mDescription, mLocation, mType) after the necessary checks.
Problems with this approach
The activity is responsible of holding/checking all the data of the EditTexts, basically making the ViewModel only responsible of interacting with the Repository.
What I'd like to accomplish
Ideally, I'd want to make the Activity only responsible of the UI, delegating everything to the ViewModel.
This way I could call sendObject() and the ViewModel would have already all of the data needed.
The LiveData situation
Right now the ViewModel has only one instance of LiveData, inside that there is a Resource (which is taken from here) and it's used to "tell" the Activity that new data has arrived or an error occurred.
This approach works fine in all Activities that just receive data from the network and display them. What do I do when I want to synchronise data coming FROM the Activity? Do I use one LiveData for each field and use that to display potential errors?
I've read most of the samples but all of the Activities there are passive.
Conclusion
Thanks to anyone who takes the time to help.
You can either separate the logic into a model string class with another class containing all your String values for the edit text fields are just assign the String values at the top of your class.
You can have a LiveData of your model in the ViewModel and alter it from the View (Activity/UI). The downside is that to update the LiveData, you need to copy whole Model, edit it and post it back to live data.
The second way is to dissect Model's components in the ViewModel into individual parameter LiveDatas. Later when form is submitted you can reconstruct the Model.
What you can do for native fields is use data binding. For other you need manually update LiveData from the View with listeners etc.

Pass data to activity android

Good day.I have an question to which i could not find an answer.I want to pass an data to an activity but i must say that i do not want to use intents as it is not aplicable to my situation.The situation is the next.Imagine an builder class which builds ui colors by specified beforehand colors.As soon as 3rd party developer done building the builder,i must start an activity with the values that the developer input in the builder.The issue is that i have lets say 10 activities,and all the activities must access that single color variable.For that purpose,the intents is hard to get done as it is not better idea to pas single variable over and over and over to each activity,i have though about inheritance,like have an base class for all activities and all of them will inherit from single class,but the issue part is that whenever i have an setter and getter inside the base class,and as soon as the developer set the according color,and i have called the setter method from the base class and started according activity,the activity will just never get the variable,it always 0,which means the variable is not set..But how it can be?
Is there any way to achieve what i want?

Change another activity without open it

Is it possible to add a textView on Activity B without showing it?
What I mean is, when i press a button (on DiallerActivity), then a textView will be added on HistoryActivity without leaving DiallerActivity.
How can I do this?
is it possible to a add textView on Activity B without show it ?
No, not directly.
An Activity is a special case Android class and shouldn't be treated as a normal Java class. Effectively the purpose of an Activity is to act as a framework for a UI so, if an Activity isn't visible then there basically is no UI. In other words, how can something be a user-interface if the user isn't able to see or interact with it?
As logical Chimp suggests, the changes should be with respect to some form of data history (a database or SharedPreferences) and it is the responsibility of your HistoryActivity to update its visual elements (TextViews) next time it is started.
One Activity shouldn't try to modify the look, feel or behaviour of another Activity except indirectly by changing some form of global data or state or by passing data to it if the first Activity is responsible for starting the second.
hmmm - not sure I fully understand your question. Are you wanting to append the dialled number to the 'HistoryActivity' without showing it?
If so, I suggest you separate your data (list of dialled numbers) from the view (HistoryActivity). Then, you only have to add the dialled number to the data record used to hold them (suggest a list). When the user opens the HistoryActivity, then you can just draw as many text fields as required to display the data.

Can I use Intent to launch the same Activity (Android)?

I am currently working on an app which takes a number of user entries. I want to have each EditText field on its own page, and instead of having a seperate activity for each entry, I wanted instead to call the same activity again. Is this possible, and if so, is it a feasible solution? Thanks.
It is possible but I don't think it is the way to go. Basically if the next input is a separate action then it deserves its own activity.
That is the way you are supposed to do it.
You could store the gathered values either in the Application class as a temporary storage or you can save it using SharedPreference. However if it is only temporary data I advice you to use the Application class rather than writing it to a file.
I would think that if your UI doesn't change (significantly) between views, then reusing your activity and displaying different data seems fine to me (I do this myself).
I keep an object on the Application class that contains a list of the sub-objects (Inputs in your case).
On the top level object, I keep the index of the current index.
This works very well, does not leak memory and is very fast to render as I swipe through my pages.

Android: launch different activities in a stack, using the same class

I have a similar issue with this one:
Android: Multiple activity instances launched by same intent. Bring one uniquely to foreground?
I need to create a stack of activities, all created by using the same class: it is a class defining a news list, only there needs to be multiple children activities that are also news lists, but from different categories. (I do need to have these activities in a stack)
The trouble is I need to change data on each of these activities after they are shown, but I can't find a way to access each one of these activities separately, since they are all using the same class, so if I used static methods, I would change the data on all these activities at the same time. Ideally, there could be a way to use references of each activity, so that I can access methods on each one separately, but I don't think there is a way of doing this.
I might as well pass parameter IDs when starting each activity, and instantiate objects at the same time, for each activity, and using these IDs later access the respective objects' methods...
Edit to clarify: Let me use an example to what I am trying to achieve. I have an A class and I am using this same class to instantiate multiple activities, in a stack. After the creation of these activities, I need to alter data, say, on one of these activities statically, so by calling A.alterData(); , but not when the activities are created, so there is no way of doing this by starting the activities with different data.. Since there are multiple instances of this class, if I do so, this will result on altering the data on all these activities, that are using the A class. Would I be able to somehow use objects and methods to these objects to alter data on different activities that are using the same class?
any other ideas?
You could use an ActivityGroup. It basically holds a list of activities and you need to control the navigation around them. It sounds like it suits your situation. There are many examples of them that can be found through google.
How I would approach changing the data on the other screens is by using shared preferences. You can store whatever data you need in there, and then (through your activity group) when you change screen, the data is refreshed. This is faster and a little more efficient than restarting the intent every time.
Another way is to change the data in the background without the user noticing. This can be done because an Activity group loads all of the Activity it holds and they are always there in the background, running, unless the developer states otherwise.
You could grab a a hold of the appropriate instance of the class you want to change the data on and then just change it.
Does any of this make sense?
I can elaborate more if needed.
I would supply the parameters to each activity, such as:
intent.putExtra("category", categoryId);
That way you aren't managing too much global state.
About changing the data - if you are talking about refreshing the data from its original source, then you should probably be doing this in the onResume() method of the Activity. Check out the Activity Lifecycle.
This has a few benefits:
you will have access to all of the context of that Activity
you won't have to do something nasty like access another Activity's data
you won't waste time refreshing data the user isn't looking at
Even if you have to make updates to the data, there are ways to make sure each Activity "minds its own business".

Categories

Resources