I’m working on a project which should have a progressdialog. But since i didn’t find an easy way to style a progressdialog, i was thinking, that the easiest way is to create a custom dialog class with it’s own style, and a frame by frame animation on it, and show it instead. Here is my code:
The xml layout for the dialog:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/dialog_background"
android:gravity="center"
android:orientation="horizontal"
android:padding="10dp" >
<ImageView
android:id="@+id/loaddialog_animation"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/loadanimation"
android:layout_marginRight="10dp" />
<TextView
android:id="@+id/loaddialog_text"
style="@style/SmallText"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</LinearLayout>
Here is my dialog class:
public class LoadDialog extends Dialog
{
private TextView message;
ImageView image;
AnimationDrawable animation;
public LoadDialog(Context context)
{
super(context, R.style.Dialog);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.load_dialog);
message = (TextView) findViewById(R.id.loaddialog_text);
image = (ImageView) findViewById(R.id.loaddialog_animation);
image.setBackgroundResource(R.drawable.loadanimation);
animation = (AnimationDrawable) image.getBackground();
}
public void setText(String msg)
{
message.setText(msg);
}
@Override
public void show()
{
super.show();
animation.start();
}
@Override
public void dismiss()
{
animation.stop();
super.dismiss();
}
}
and the animation resource:
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="true" >
<item android:drawable="@drawable/loadbar_01" android:duration="50" />
<item android:drawable="@drawable/loadbar_02" android:duration="50" />
<item android:drawable="@drawable/loadbar_03" android:duration="50"/>
</animation-list>
The problem is that the animation doesn’t starts, when i try to show it. I know, there are a lots of topics about this problem, but here are the things, that i have tried:
- Put the dialogs show() in different parts of my activity: onResume() and onCreate().
onWindowFocusChanged() is not an option, since i want to show a dialog. dialog shown ->focus change, dialog dismissed->focus change ->infinite amount of dialogs shown. - I have tried animation.setCallback(image), animation.setVisible(true, true), animation.invalidateSelf() none of them works.
- I have tried image.post() and put a runnable in there as a parameter, and in the run method starting the animation, no luck.
At this point i’m starting to run out of options. The I’m only trying to show 3 images changing until the dialog is dismissed. Please if you know, what am i doing wrong, or any alternative, let me know!
Thanks in advance!
Change android:oneshot=”true” to android:oneshot=”false” so that it repeats. It should be currently only doing one cycle and since your show time is 50, that is really fast. I would also change that to maybe 200 or so..
Also, you are setting the image in your xml layout, but animated the background, so you need to either change the xml layout to this:
or change you code to get the src file rather than the background, like this: