こんにちは
この投稿では、 ProgressDialogなどのAndroid UI要素と、一般的にアプリケーションの進行状況、可能な実装、および問題を表示するトピックについて説明します。
カットの下に、トピックに関するいくつかの考えとかなりのコードがあります。 おそらく、私がお話しするトピックは多くの人にとって明白なように思えるかもしれませんが、Merketのアプリケーションの同じ「ソリューション」を見ると、すべてがそれほど明確ではないようです。 さらに、このトピックに関するあなたの考えやベストプラクティスを聞きたいと思います。
問題または解決策#0
ProgressDialog -Androidの基本要素は、タスクの進行状況を表示するための非常に人気のあるツールです。 ProgressDialog + AsyncTaskの実装のコーシャーの例は、 こちらの mike114 ハブユーザーから入手でき ます 。
すべて問題ありませんが、重大な欠点が1つあります。ProgressDialogはモーダルです。 つまり 操作中、ユーザーはUIと対話できません。 はい、これは正当化される場合があります。特に、最初のログオンなどの代替オプションがない場合は特にそうですが、多くの場合、これは正当化されません。 ユーザーが操作の終了を待つようにしますが、もっと便利なことができます。
多くの例がありますが、ここでは、 bugrimov ユーザーはProgressDialogを使用して、サーバーからコンテンツがロードされている間に進行状況を表示します。 同時に、何らかの理由でこれがそれほど速く起こらない場合、ユーザーは何かが彼に戻るまで待つ必要がありますが、代わりにいくつかの並列タスクを開始し、いくつかがロードされている間に、すでにダウンロードされたタスクを読みます。
注:ProgressDialogは、 それは非常に馴染みがあり、その結果、Androidユーザーにとっては不合理な使用を許す可能性が高いためです。
ソリューションNo. 何も表示しない
長所:
短所:
- ユーザーは常に暗闇の中にいて、他に何かが行われているかどうかはわかりません。
- これとProgressDialogを使用しない後続のすべての決定については、複雑な作業ロジックで構成されています。 タスクの実行中、ユーザーはブロッキングProgressDialogを使用するよりもはるかに多くのアクションを実行できます。たとえば、同じ前のタスクが完了する前にタスクを再起動するなど、これをさらに考慮する必要があります。
つまり 導き出せる結論:進行状況を表示するときに白痴に陥らないでください。ユーザーが操作の実行プロセスに関する情報を必要としない場合、進行状況の表示は省略できます。
決定番号2。 ProgressBarを使用する
ProgressBar -Androidの基本コンポーネント。これにより、実行の進行状況をビューに直接表示できます。
何かを手に入れるには:
通常のxmlリソースを作成し、その中にProgressBarを定義するだけで十分です。
<ProgressBar android:layout_width="wrap_content" android:layout_height="wrap_content" style="?android:attr/progressBarStyleInverse" android:layout_alignParentRight="true"/>
さらに、レイアウト内の他のすべてのコンポーネントと同様に、このプログレスバーを使用できます。
... progressBar = (ProgressBar) findViewById(R.id.progress_bar); progressBar.setVisibility(View.VISIBLE); ...
このソリューションはAndroidマーケットで使用されます。インストール/更新中にインストール済みアプリケーションのリストに移動すると、現在のタスクの進行状況を確認できます。
多くの場合、同じタイプの多くの要素をロードするときに同様のアプローチが使用されます。最初に、プログレスバーを含む空のフォームが表示され、次にダウンロード中にコンテンツが入力されます。
長所:
- 繰り返しますが、それはユーザーをブロックしません。
- また、最初のソリューションと比較して、進捗状況、つまり ユーザーは何かが起こっていることを認識しています。
- 画面上の場所を占め、モバイルデバイスでは、有用な表面の各「スクラップ」は金の重さで価値があります。 もちろん、進捗がない場合は非表示にすることができますが、UIロジックに違反し、各要素が代わりに使用されます。
- ポジショニングのもう一つのマイナス、なぜなら この進行状況は画面に関連付けられているため、別の画面に切り替えた場合の対処方法、つまり、 ユーザーに何かを見せるかどうか、そして最も重要なのはどこか。
- そしてもう1つのマイナス点は、プログレスバーの位置が、その隣にある要素に無意識に関連付けられていることです。 実際には画面全体が更新されているにもかかわらず、最終的に特定の要素が更新されているという誤った仮定がないように、インターフェイスをさらに慎重に検討する必要があります。
- すべての非ProgressDialogソリューションの共通のマイナス:作業のロジックの複雑さ(ソリューションNo.1を参照)。
決定番号3。 通知領域内でProgressBarを使用する
このソリューションは、Androidマーケットでも使用されます。ユーザーがアプリケーションのインストールを開始すると、通知領域に別の進行状況が追加され、ユーザーは現在の位置に関係なくそこに移動できます。
ProgressBarを通知領域に追加するには、まず次のようなXMLリソースを作成する必要があります。
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:paddingLeft="5dip" android:paddingRight="5dip"> <TextView android:id="@+id/text_progress" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:textColor="@android:color/black" android:textStyle="bold" /> <ProgressBar android:id="@+id/status_progress" android:layout_width="fill_parent" android:layout_height="20dip" android:layout_centerVertical="true" android:progressDrawable="@android:drawable/progress_horizontal" android:indeterminate="false" android:indeterminateOnly="false" /> </RelativeLayout>
次に、通知領域に新しいレイアウトを追加します。
final Intent intent = new Intent(this, Main.class); final PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, 0); // Notification area final Notification notification = new Notification(R.drawable.icon, "text in notification area", System.currentTimeMillis()); notification.flags = notification.flags | Notification.FLAG_ONGOING_EVENT; // Notification View notification.contentView = new RemoteViews(getApplicationContext().getPackageName(), R.layout.progress_bar); notification.contentIntent = contentIntent; // Progress Bar notification.contentView.setProgressBar(R.id.status_progress, 100, 0, false); final NotificationManager notificationManager = (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE); // notification' notificationManager.notify(ID, notification);
作成されたプログレスバーを使用するには、次のコードを使用できます。
// i notification.contentView.setProgressBar(R.id.status_progress, 100, i, false); // notification.contentView.setTextViewText(R.id.text_progress, "Current progress: " + Integer.toString(i)); // notificationManager.notify(ID, notification);
その結果、通知領域のセルは次のようになります。
長所:
- 再び、ユーザーをブロックしません。
- 決定2のように、進行状況が表示され、ユーザーは何かが起こっていることに気付きます。
- このソリューションは、プログラムウィンドウ、つまり どのウィンドウからでもアクセスできますが、ウィンドウ自体を変更する必要はありません。
- 進行状況を表示するために追加のウィンドウスペースは必要ありません。
- 通知領域での通知の表示が完了した後(完了自体ではなく、表示されたメッセージのみ)、進行状況は表示されません。 ユーザーは何かが起こっているかどうかを知りません。 これは、彼が定期的にそこを見る必要があることを意味し、あまり便利ではないかもしれません。
- このソリューションは直観的ではありません。
- すべての非ProgressDialogソリューションの共通のマイナス:作業のロジックの複雑さ(ソリューションNo.1を参照)。
決定番号4。 アプリケーションのタイトルバー内でProgressBarを使用する
このソリューションは、 gReaderなどの多くの製品で使用されています。
実装するには、コンテンツを含むレイアウトを作成する必要があります。私の場合はProgressBarのみです。
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ProgressBar android:id="@+id/status_progress" android:layout_width="wrap_content" android:layout_height="wrap_content" style="?android:attr/progressBarStyleSmallTitle" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:indeterminateOnly="true" android:visibility="invisible"/> </RelativeLayout>
onCreateメソッドで 、既存のタイトルバーをレイアウトでカスタマイズします。
Window window = getWindow(); window.requestFeature(Window.FEATURE_CUSTOM_TITLE); setContentView(R.layout.main); // layout title bar' window.setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.progress_bar); // ProgressBar' final ProgressBar progressBar = (ProgressBar) findViewById(R.id.status_progress); progressBar.setVisibility(View.VISIBLE);
最終的には、次のようになります。
この例は、リアカスタムレイアウト用に設計されています。 このレイアウトで定義されたすべてのコンテンツはタイトルバーに移動します。 ProgressBarだけでなく、必要な場合のみ、より簡単なオプションがあります。
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); setContentView(R.layout.main); setProgressBarIndeterminateVisibility(true); // false,
長所:
- 再び、ユーザーをブロックしません。
- 決定3とは異なり、進行状況は常に顕著です。
- 決定No. 2およびNo. 3と同様に、進行状況が表示され、ユーザーは何かが発生していることを認識します。
- 進行状況を表示するために追加のウィンドウスペースは必要ありません。
- 進行状況はウィンドウに関連付けられており、異なるウィンドウ間で表示する必要がある場合は、個別に提供する必要があります。
- タイトルバーは、通知領域よりも高さが低いため、より少ない情報を含めることができます。そうしないと、識別しにくくなります。
- このようなソリューションは、スタイルの標準セットを持つタイトルにのみ適しています。 つまり TabHost内のアクティビティでは、添付できません。
- すべての非ProgressDialogソリューションの共通のマイナス:作業のロジックの複雑さ(ソリューションNo.1を参照)。
決定番号5。 すべてのソリューションを使用する
私の意見では、これが最良の解決策です!
1つだけを使用する必要はありません。すべては解決される問題、それがいかにトリッと聞こえるかに依存します。 何も表示しないことが最善の場合もあります。ProgressDialog、ProgressBarのバリエーション、および他の何かを表示する場合もあります。 繰り返しますが、それはすべてタスクに依存します 。
結論の代わりに
決定を下す場合は、開発の単純さの考慮事項から先に進まないでください。また、知っていること、学ぶことを決定に限定しないでください。 ユーザーがより便利で理解しやすい方法について考えてみてください。
ここで紹介したソリューション以外のソリューションを使用する場合は、それらについて教えてください。多くのAndroid開発者がこのような例に興味を持っていると思います。