I have seen a few people trying to get an indeterminate progress bar to show and that is kind of the opposite problem than I am having.
What I want is when the app starts to do work the user sees an indeterminate progress bar at the top of the Window. Then goes away when the work is complete.
I am using the app compat v7 library. My Activity extends android.support.v7.app.ActionBarActivity.
The code I have in my Activity.onCreate() is:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
supportRequestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.main);
...
}
Then when work starts (in a Fragment, not on the main thread):
((ActionBarActivity) getActivity()).setSupportProgressBarIndeterminateVisibility(true);
Then when work completes:
((ActionBarActivity) getActivity()).setSupportProgressBarIndeterminateVisibility(false);
Two curious behaviors I can't really explain. First, on setSupportProgressBarIndeterminateVisibility(true) Both the Window progress shows (that I want) and the Action Bar's circular progress bar shows.
Second, on setSupportProgressBarIndeterminateVisibility(false) the Window progress hides (hurray) and that's it... the circular progress bar stays visible...
So I don't know why any of the Action Bar's progress stuff happens, nor do I know how to make it stop. If I knew the id of the progress view in the Action Bar I could look that up in the menu and make sure it stays hidden, but I don't know that id (also seems like the wrong way to go about that).
Any help explaining this behavior would be great. Thank you!!
For the first issue:
It's not obvious from the code given, but the calls to setSupportProgressBarIndeterminateVisibility were being called from a background thread. If I move that code to the UI Thread, everything works without UI glitches.
For the second issue:
It does seem that the default behavior should be to show the circular progress bar on the ActionBar. Not entirely sure why the progress on the top of the activity shows as well. You can hide the ActionBar's progress with a style, but I moved away from that before I tested it on older Android platforms.
Related
Background
I have an app that has 2 activities :
splash activity, which is shown in full screen (no action bar, no notification bar)
main activity, which has both an action bar (uses actionBarSherlock) and a notification bar.
The problem
For some reason, when going from the first activity to the second, there is a "jumpy" layout process, which shows the content of the second activity without the action bar and notification bar, and a moment later it shows them both.
This causes the content below to move too, which is very noticeable.
Possible solution
As I've seen, a possible solution would be to hide the action bar and show it a bit later (500ms later), but this seems like a bad solution (making it slower and hiding for no reason), plus I need to get the actionBar items positions for another purpose (for showing a tutorial).
The question
Is it possible to avoid the "jumpiness"? One that doesn't involve such a weird workaround?
I've solved my problem doing the following:
1.- I have to optimize all the screens where the AB was shown. In some cases I used ListViews which weren't correctly implemented and that caused a noticeable load time in the activity.
2.- I have shown the status bar BEFORE starting the new activity. I mean: I've shown the status bar in the fullscreen activity just before starting the non-fullscreen one. With that I achieved that the layout of the second activity (non-fullscreen) was never resized.
With this two little changes now the AB transition is much more smoother.
You can find the complete post with my answer at: Smoother transition from fullscreen activity using ActionBarSherlock
Why don't you use some other animation slide transitions rather than default popping one?
something like this?
overridePendingTransition(android.R.anim.accelerate_interpolator, android.R.anim.slide_out_right);
Here is the Animation lists that you can use
http://developer.android.com/reference/android/R.anim.html
I am using an Action bar in my project. I am displaying a progress bar via the below approach.
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setProgressBarIndeterminateVisibility(true);
However, what I'd really like to do is replace the left most image icon with the progress indicator when arbitrary background processes run and then returns the usual icon when complete.
Can anyone tell me the steps needed to replace this icon with a functional Progress indicator. It only needs to be an intermediate one.
Looks like you can find some suggestions here: Android: dynamically change ActionBar icon?.
Specifically, you can access the icon by using
Activity.findViewById(android.R.id.home)
And then just set and re-set the icon as needed.
You need to build a custom layout for this and use actionbar.setCustomView(yourcustomlayout);
In your custom layout have an imageView(which is your app icon) and progress bar(initially which is set to invisible).
When running the background process just set the visibility between image view and progress bar.
I am trying to replicate the experience found when you are uninstalling an app in ICS. Specifically the indeterminate progress indicator under the title bar. I have tried using requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS) and the various methods on Activity but to no avail. It instead shows a spinning progress bar in the top right hand corner of the screen/title bar. Am I missing something simple here? Or is this completely custom?
Here is the code I am using:
#Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
super.onCreate(savedInstanceState);
setProgressBarIndeterminate(true);
setProgressBarIndeterminateVisibility(true);
}
You are using the ActionBar indeterminate progress bar, but you are looking for a ProgressBar View.
You can create the View programmatically or add it to a layout file like --
<ProgressBar
android:id="#+id/progressBar1"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:indeterminate="true" />
Typically, you can decide when it is shown by calling .setVisibility(View.VISIBLE) to show and .setVisibility(View.GONE) when you are done.
If you have a minimum API of 11 and set your activity or app theme to #android:style/Theme.Holo you will get exactly that ProgressBar shown in your image.
If you want a similar effect on pre-API 11 devices, check out HoloEverywhere
Disclaimer: #iagreen's answer is still the right one -- to get layout similar to the one in uninstall activity your best option is to just use it in a layout, not rely on window features)
But you were on a right track with windows features, you just mixed two of them up.
See, this:
setProgressBarIndeterminate(true);
requests the window's [horizontal] progress bar to be indeterminate. And this:
setProgressBarIndeterminateVisibility(true);
shows the window's indeterminate progress bar -- thing is, it's a completely diffrerent view.
To clarify things further, this gets you a horizontal indeterminate progress bar shown at the top of the window
requestWindowFeature(Window.FEATURE_PROGRESS);
setProgressBarIndeterminate(true);
setProgressBarVisibility(true);
and this gets you a spinner-style progress bar in the actionbar
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setProgressBarIndeterminateVisibility(true);
That's a horizontal progress bar in the image, the Action Bar indeterminate progress bar is a Spinner style. You'd either need to make a custom view for the action bar, or put it as a view in your main layout. You can hide the action bar and make a custom header for a particular activity. Just use the Spinner style indeterminate progress bar, it's what everyone expects to see in the Action Bar.
I have two tabs in my app.First tab displays the details of user and the second tab displays the applications that are installed on his device.I have used Package manager for getting the installed apps and it is running ins background thread. If the user clicked the second tab before the background thread completes I want to show a progressdialog.But the problem is if progressdialog is displayed on the screen user can't switch to next tab.Is there any way to solve this issue.Thanks in advance.
Progress dialogue by default works in dialogue mode and freezes any operations until the progress bar is gone.
I had faced issues with controlling progress bar (though my requirements were more than yours like customizing looks and showing/ hiding/ freezing bar at will), so I ended up creating a custom progress bar.
It is pretty simple
Create 2 straight straight bars, one black and other of any color (if you want something more fancy, it is upto you)
Add the bars to drawable and then to your layout xml in hidden mode. The colored bar exactly on top (superimpose) of black bar
Now where you want to show the progress bar, make the black bar visible first, and adjust the width of colored bar (on top of black bar) as per the progress.
This will give you proper functionality of the progress bar.
As you are playing around only with imageviews, you have full control over when to show or hide the bar. Also by default it will not freeze the view. You can freeze at will by capturing onTouch event.
I want to draw an spinning wheel on the title bar of the activity when another activity is loading in background. But I don't know how to do that. Please Help me regarding that. Listen I don't want Progress Bar, I want some thing like progress bar on the title bar of the screen, which is running till another activity is loaded or not?...........
I believe the only way to do it is to use your own custom title bar. The best thing to do is to make a title bar layout and just it in all the other layouts and maybe have a helper class to show and hide the progress bar.