web-dev-qa-db-ja.com

ProgressDialogで進行状況インジケーターを簡単に中央に配置する方法(タイトル/テキストが渡されない場合)

progressDialog = ProgressDialog.show(this, null, null, true);を呼び出す場合、通常、開発者は進行状況表示画像のみを表示し、通常は(少なくとも通常のUIデザインの観点から)ウィンドウ内の中央に表示されることを期待します。ただし、画像は左端にあります。右側の(オプションの)テキストのパディング/マージンはまだ計算されているようですが、テキストをパラメーターとして渡していません。開発者の生活が少し楽になるだけです:)したがって、デフォルトで進行状況インジケーターを中央に配置するためだけに、カスタムダイアログを作成する必要はありません。

(私はこれを http://code.google.com/p/Android/issues/detail?id=9697 に機能リクエストとして提出しました。これも改善したい場合はスターを付けてください)。

今私の質問:

  1. 独自のカスタムアラートダイアログクラスを完全に作成せずに、進行状況画像を簡単に中央揃えするにはどうすればよいですか?私が見落としていたかもしれないパラメーターはありますか?

  2. さらに、背景を透明に設定する方法は?

私もこれについて疑問に思っています: https://stackoverflow.com/questions/2866141/how-to-put-custom-animation-into-a-progressdialog 私は実際に自分で試したことはありませんしかし、カスタムアニメーションを作成できない場合、アニメーション化された進行状況インジケーターが必要な場合、常にProgressDialogクラスを拡張する必要がありますか?ただし、ProgressDialogクラスを見ると、通常のドロアブル( ProgressDialog.Java )以外には何も見つかりません。AnimatedDrawableは使用されていません。

62
Mathias Conradt

いくつかのテストを行いましたが、これを達成する最良の方法はカスタムDialogを実行することです。

これが私がしたことの例です。これは質問番号2に答えますが、質問番号1を修正する方法のアイデアを提供します。

public class MyProgressDialog extends Dialog {

    public static MyProgressDialog show(Context context, CharSequence title,
            CharSequence message) {
        return show(context, title, message, false);
    }

    public static MyProgressDialog show(Context context, CharSequence title,
            CharSequence message, boolean indeterminate) {
        return show(context, title, message, indeterminate, false, null);
    }

    public static MyProgressDialog show(Context context, CharSequence title,
            CharSequence message, boolean indeterminate, boolean cancelable) {
        return show(context, title, message, indeterminate, cancelable, null);
    }

    public static MyProgressDialog show(Context context, CharSequence title,
            CharSequence message, boolean indeterminate,
            boolean cancelable, OnCancelListener cancelListener) {
        MyProgressDialog dialog = new MyProgressDialog(context);
        dialog.setTitle(title);
        dialog.setCancelable(cancelable);
        dialog.setOnCancelListener(cancelListener);
        /* The next line will add the ProgressBar to the dialog. */
        dialog.addContentView(new ProgressBar(context), new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
        dialog.show();

        return dialog;
    }

    public MyProgressDialog(Context context) {
        super(context, R.style.NewDialog);
    }
}

すべての静的メソッドは this リンクに由来し、奇妙なことではありませんが、コンストラクターで魔法が発生します。パラメーターとしてスタイルを渡すことを確認してください。そのスタイルは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="NewDialog" parent="@Android:Theme.Dialog">
        <item name="Android:windowFrame">@null</item>
        <item name="Android:windowBackground">@Android:color/transparent</item>
        <item name="Android:windowIsFloating">true</item>
        <item name="Android:windowContentOverlay">@null</item>
        <item name="Android:windowTitleStyle">@null</item>
        <item name="Android:windowAnimationStyle">@Android:style/Animation.Dialog</item>
        <item name="Android:windowSoftInputMode">stateUnspecified|adjustPan</item>
        <item name="Android:backgroundDimEnabled">false</item>
        <item name="Android:background">@Android:color/transparent</item>
    </style>
</resources>

この結果は、画面の中央で回転するProgressBarです。 backgroundDimなし、Dialogボックスなし。

104
Macarse

簡単でカスタマイズ可能な方法:

アニメーションの定義:(res/drawable/loader_anim.xml)

<animated-rotate xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:drawable="@drawable/image_for_rotation"
Android:pivotX="50%"
Android:pivotY="50%" />

または:

<animation-list xmlns:Android="http://schemas.Android.com/apk/res/Android" >
<item
Android:drawable="@drawable/img_loader_frame1"
Android:duration="150"/>
...
<item
Android:drawable="@drawable/img_loader_frame2"
Android:duration="150"/>
...
</animation-list>

その後、レイアウトの定義:(res/layout/loader.xml)

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/layout_root"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical"
Android:layout_gravity="center_vertical|center_horizontal"> 
<ProgressBar
Android:layout_width="200dp"
Android:layout_height="200dp"
Android:indeterminateDrawable="@drawable/loader_anim" />
</LinearLayout>

そして、インスタンス進行ダイアログ:

ProgressDialog dialog;
...
dialog = ProgressDialog.show(this,null,null);
dialog.setContentView(R.layout.loader);
...
process();
...
dialog.dismiss();

詳細:

32
Hpsaturn

以下を使用します。レイアウトファイルは不要で、画面の中央に中央揃えのフチ無しブロッキングプログレスバーを配置します。

private ProgressDialog progressDialog;


setUIToWait(true);

...long process...

setUIToWait(false);


private void setUIToWait(boolean wait) {

    if (wait) {
        progressDialog=ProgressDialog.show(this,null,null);
        progressDialog.setContentView(new ProgressBar(this));
    } else {
        progressDialog.dismiss();
    }

}
24
egalot

不確定な進行状況バーのみを表示する場合。

ProgressDialog progressDialog = ProgressDialog.show(this, null, null, true, false);
progressDialog.setContentView(R.layout.progress_layout);

そして、「progress_layout.xml」という名前のレイアウトxmlファイルを作成します

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical" >

    <ProgressBar
        Android:id="@+id/progressBar1"
        style="?android:attr/progressBarStyleLarge"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_gravity="center" />

</LinearLayout>
19
Thafer Shahin

完了するには、以下の方法を実行してください

Res-> values-> stylesに以下のコードを追加します

<style name="MyGravity" parent="Android:Theme.Material.Dialog" ></style>

次に、下記のようにProgressDialogを作成します

ProgressDialog dialog = new ProgressDialog(ctx, R.style.MyGravity);
dialog.getWindow().setBackgroundDrawableResource(Android.R.color.transparent);
4
Arun Mohan
//create Dialog by using below method

@Override
protected Dialog onCreateDialog(int id) {

    switch (id) {

    case DIALOG1_KEY: {
        Dialog dialog = new Dialog(this,R.style.NewDialog);
        dialog.setContentView(R.layout.progress);
        dialog.setCancelable(true);
        return dialog;
    }
    }
    return null;
}

//then in your onCreate () you can call like below

@Override

public void onCreate(Bundle savedInstatncestate)

{

final Handler mHandler = new Handler();
showDialog(DIALOG1_KEY);
new Thread() {
public void run() {
try {
    sleep(3000);
    Runnable r = new Runnable() 
    {
    public void run() 
    {
               //do your background process

             dismissDialog(DIALOG1_KEY);
    }

        };
mHandler.post(r);
     } catch (Exception e) {
     }
   }
}.start();
}
2
Puthuumalar

中央のProgressDialogを表示したいすべてのアクティビティに、常に1つのProgressBarを追加できます。 acitivity.xmlで次を使用:

<ProgressBar
Android:layout_width="wrap_content"
Android:layout_height="wrap_content" 
Android:id="@+id/progressBar"
Android:layout_centerInParent="true"
Android:visibility="gone"/>

Acitivity.Javaで、使用します

ProgressBar bar = new Progress();
bar = (ProgressBar) findViewById(R.id.progressBar);

これで、ProgressBarを表示したいときは、その可視性を可視に設定するだけで、キャンセルするには可視性を設定します。

bar.setVisibility(View.VISIBLE);
bar.setVisibility(View.GONE);
0
Rathore