Create a new DialogFragment from another DialogFragment instantiated in another context - android

I am developing an Android library to ask the users of an app to give a rating on the Play Store.
The UX of the library consists in a few dialogs. Depending on the answer to the first question I might need to dismiss the current dialog, to show another dialog or to take the user to the Play Store.
Everything works nice unless I rotate the screen in the middle of the process.
I tried to solve my issues with the use of fragments. With fragments I am not losing anymore the state of the dialogs with the rotation but I am having troubles instantiating the second DialogFragment. The problem is that, after a rotation, the context of the first DialogFragment is no more active and it has no way to retrieve the new context. That results in exceptions every time I try to instantiate the new DialogFragment.
Is there any way I could solve this issue?
Thinking again at the problem, it seems that my design choice was wrong but I am not very experienced in Android development. Every advice will be more than welcome.

You should be using the listener pattern. Define an interface in each dialog and send clicks back to the activity. Let it create the dialogs.
see here
Also, if you need a context in the fragments, just call getActivity(), don't create an unnecessary context variable that could later give back an activity that's already gone. I hope that helps. I can't give a better answer without some code to see what's going wrong in this specific situation.

Related

Questions about using Dialogs in android?

I'll get straight to the point. Dialog's confuse the hell out of me. Why? Because it seems as though there are 5 different ways on instantiating them, giving them a custom layout, and using them. To add insult to injury the documentation on them is very poor. so I'm going to post the main questions I have here, and hope you guys can clear some of the confusion for me.
Question One:
what is the Real Difference between Dialog, and DialogFragment?
Question Two:
why is it better to use onCreateView, rather than onCreateDialog?
furthermore, Whats the difference?
Question Three:
why not just do *Dialog dialog = new Dialog();* everytime i need one,
rather than subclass DialogFragment constantly?
I apologize if this thread may not seem like a good fit for the community, but please keep in mind these are very real, and un-answered questions. Of all the tutorials I've read, from slidenerd-to-vogella-to-Stack everything explains the How, but not Why, which is just as important, if not more. Thanks Guys!
The difference between them is that a Dialog can only show a custom view but has no means in itself for you to interact with it's views / widgets programmatically at the runtime of the Dialog (ie when it's shown). DialogFragment extends Fragment and has all capabilities and the lifecycle of a Fragment (or very similar to them when used as a dialog).
DialogFragment can also be used as a 'normal' fragment, which means you could use a DialogFragment to show a dialog on a tablet or have it live inside an activity (ie full-screen) on a phone.
If the DialogFragment is also to be used as a Fragment, it has to return a View via onCreateView, so you'll have to implement onCreateView anyway. You can probably avoid code repetition if you only implement onCreateView and not onCreateView and onCreateDialog. But I've never heard someone say that is is 'better to use onCreateView, rather than onCreateDialog'.
You don't have to subclass DialogFragment for most dialogs. To show a simple Dialog eg. asking the user a question of showing a little bit of information, you can instantiate a new Dialog() or use the DialogBuilder. I use DialogFragments only when there's some logic going on within the Dialog that I want to reside in it's own class and makes use of the DialogFragments lifecycle.

Need Advice to Use Fragment on Android Studio

here i want to develop an app that can run a simple quiz for psychology character test, but here i need some advice on how to show the question on the activity. Because i want to showing each question without moving to other activity.
This is my temporary layout (it's still ugly XD), but i want the question can appear on the inside of that red box. And when user press Next button, the question inside that box can changed but before it change the app has been stored the answer of previous question.
I really don't know how to use fragment or something like that.
NB. This is my mainActivity look :
For your app I would recommend not to use fragments at all, it will make your app much slower than it can be.
What I would do in your case, is only load the new question in the textbox on pressing next, and call an asynchronous function (asynctask) to perform the storage of the answer. This way the user sees no delays whatshowever.
If getting the next question required a server connection, use a progress dialog in between to show the user something happens.
Agree with Bas van Stein, using different fragments will slow down the app. What you could do is separate frequently changing part of your screen (e.g. question with answer options) into a fragment and reload it's data on Next/Answer button click. This will separate the code and make it easier to maintain and change it later.
On the other hand you could do it in the activity itself if you don't want to use fragment.

How to raise one DialogFragment above another?

Say I have several dialog fragments that are shown in response to messages and events that can arrive in any order. Normally, the last dialog shown will be on top. Is there a way to show a dialog fragment under an existing one, or change their z-order after they are shown?
It should be pretty rare for my app to show more than one dialog at a time, but it could happen. There is one particular dialog that should always be on top whenever it's visible.
A dialog creates an application sub-window. Android's window manager (WindowManagerService) automatically computes window's z-order depending on its type and stores it in WindowState's mLayer field. Internal Android classes have access to this field and change window's z-order sometimes, but this API is not exposed to Android SDK. So it seems that the only way to affect dialog's z-order is to recreate it.
Everything I wrote above is just a result of a brief investigation of Android's source code so I may be wrong. And maybe there's some hacky way to do what you want using reflection and accessing private fields and methods. But I'm not sure it's a good idea to try and do it. In my opinion it would be better to have just a single dialog or even activity, and manage fragments within it.

Get Android AlertDialog to appear on top of all activities at all times

Have been searching the web and stack overflow for this - I found a potential answer but it was not well explained enough for me as I am new to android.
I am working on an android app that displays alert dialogs at key times. I am currently having the app add the dialog to the current activity to make sure it appears.
However, sometimes the dialog can appear just as the user tapped a button to a new activity, causing the new dialog to be appearing on the previous activity and not seen unless the user hits back.
Another case is occasionally two dialogs will be appearing, and upon accepting the top-most the app brings the user to a new activity - leaving the second dialog on the previous activity and again unseen without hitting back.
The closest I could find was here: Keep dialog/activity always on the top
The above question was not fully explained in the answer. I tried following the advice by adding a new relative layout to each of my existing layouts with the ID "alert_layout" and I already had a BaseActivity all my activities extend from. When I need to show an alert I add it to the current activity's "alert_layout"'s context but it is yielding the same result. I am not sure how to add a layout that is never changed between activities - but even then, the AlertDialog is looking for a context to be added/shown to, not a layout, so I'm confused as to how to accomplish this.
I am new to Android development so I apologize if I'm missing the obvious, but I'm hoping there is an easy way to make sure AlertDialog is always on top of all activities and remains there across activity changes.
Thank you in advance for any assistance.
It's not going to work using Dialogs. You have to draw a View above the rest of your app's UI.
Android offers this possibility by drawing windows on top of all other applications. You need to have the SYSTEM_ALERT_WINDOW permission. Additional details in this question: What APIs in Android is Facebook using to create Chat Heads?

Design advice: multiple choice quiz

I'm interested in hearing what you guys think is the most efficient/solid object-oriented design for a simple multiple choice quiz.
Basically, the app presents a series of questions with 4 choices each. If the choice you selected is correct, then a new activity will display some congrats and full details behind the correct answer and if you're wrong it'll say you got it wrong, along with the details, etc.
After that, the user goes to the next question. On each new question, you'll see your score so far. So maybe you get 50 points for each correct answer, something like that.
Here's how I thought about implementing this: Create a custom view with some radiobuttons or some other widget that could be used for choosing an answer. The custom view takes a Question object, which is just a regular old java object, with fields for choices 1-4. Then, in the custom view, I can set the text of the radiobuttons to the choices from my Question object.
So in my activity it would look something like Question myQuestion = new Question("string for choice 1", "string for choice 2"...)
And then..
Use the question with my custom view. QuestionView myView = new QuestionView(this, myQuestion);
Ok so that's all great. I'm just wondering if I'm setting myself up for trouble. For one, I've got to keep track of the score across all the question activities. Does it make sense to have all of my questions subclass some, mostly empty, activity that I create which can have a counter in it that gets incremented anytime the user gets an answer right (i.e in my superclass activity int scoreKeeper; and in each activity that subclasses this activity: if(choiceIsCorrect) scoreKeeper++). This will allow the score to persist across the activities. I realize I could hold a score between activities by passing and extra to each new activity and then simply adding to it, but that doesn't really seem to make sense to me.
Sorry for all of the blabbering..but I guess my questions are: what do you think is the simplest design for this? Also, in general, I always assumed that you should always use a new activity whenever the user is doing a "single, focused thing"...as the Android paradigm states. But sometimes it feels weird to create so many activities. I know the fact that "it feels weird" is no reason not to do it, but when does it make sense to simply reuse on activity (e.g. in this case, just swapping in a new question in my activity and updating the UI accordingly) as opposed to starting a new activity?
Also, a more detailed question - what would be a smooth way to set which choice (e.g. which radiobutton) contains the right answer, so that when the user presses submit, I can check if they have the right answer and yes/no then react accordingly?
To summarize:
What is a straightforward, object-oriented way to create a succession of multiple choice question activities?
What's the most sensible way to keep track of the score?
Does each question necessarily need to be a separate activity? (And, in general, how do you guys approach the question of whether something ought to be a separate activity?)
Also, kind of a particular: what's the easiest way for me to flag which choice is the correct one so I can check to see if the user got right? I know that with a radiobutton, for example, you can use onCheckedChangeListener and retrieve which radiobutton is currently checked, but I'm not sure how to use that in my design to check if the user got it right...
Thanks!
I would not make the "correct/incorrect information activity" its own activity. Instead, when the user selects a radio button choice, and then clicks an "OK" button, a Dialog should pop up. When they close the dialog, there is a button there to advance to the next question.
I would say you should do this all in one activity.
I'm going to use one activity with a ViewFlipper for cycling through questions.

Categories

Resources