私は現在、私のアプリケーションでリストビューを使用しています。リストビューを表示するにはおそらく1秒かかります。
私が現在していることは、「ロード中」のテキストを作成するためにリストビューの@ id/Android:emptyプロパティを使用することです。
<TextView Android:id="@id/Android:empty"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="#FF0000"
Android:text="Loading..."/>
さて、このテキストの代わりにローディングダイアログで使われているアニメーションサークルでそれを置き換えたいと思います、私はあなたが私が何を意味するか知っていると思います:
編集:私はダイアログが欲しくありません。私は自分のレイアウトの中にそれを見せたいのです。
どうもありがとうございました。
アクティビティのレイアウトファイルにこのxmlブロックを入れるだけです。
<RelativeLayout
Android:id="@+id/loadingPanel"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:gravity="center" >
<ProgressBar
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:indeterminate="true" />
</RelativeLayout>
そして、ロードが終わったら、この一行を呼んでください:
findViewById(R.id.loadingPanel).setVisibility(View.GONE);
その結果(そしてそれもまた回転します):
次のxmlを使って、これを行うことができます。
<RelativeLayout
style="@style/GenericProgressBackground"
Android:id="@+id/loadingPanel"
>
<ProgressBar
style="@style/GenericProgressIndicator"/>
</RelativeLayout>
このスタイルで
<style name="GenericProgressBackground" parent="Android:Theme">
<item name="Android:layout_width">fill_parent</item>
<item name="Android:layout_height">fill_parent</item>
<item name="Android:background">#DD111111</item>
<item name="Android:gravity">center</item>
</style>
<style name="GenericProgressIndicator" parent="@Android:style/Widget.ProgressBar.Small">
<item name="Android:layout_width">wrap_content</item>
<item name="Android:layout_height">wrap_content</item>
<item name="Android:indeterminate">true</item>
</style>
これを使用するには、visibility値をGONEに設定してUI要素を非表示にし、データがロードされるたびにすべてのビューでsetVisibility(View.VISIBLE)
を呼び出してそれらを復元します。ロード中のアニメーションを隠すためにfindViewById(R.id.loadingPanel).setVisiblity(View.GONE)
を呼び出すことを忘れないでください。
あなたがローディングイベント/機能を持っていないが、ちょうどx秒後にローディングパネルを消したいのであれば、隠れ/表示を引き起こすために Handle を使ってください。
これは一般に不確定 進捗バー または不確定進捗ダイアログと呼ばれます。
これを Thread および Handler と組み合わせて、必要なものを正確に入手してください。グーグル経由でこれを実行する方法の例がいくつかあります。このようなタスクを実行するためにこのクラスの組み合わせを使用する方法を学ぶために時間を費やすことを強くお勧めします。これは、さまざまな種類のアプリケーションで非常に便利で、スレッドとハンドラがどのように連携して機能するかについての優れた洞察を得ることができます。
これがどのように機能するのかを説明します。
Loadingイベントがダイアログを開始します。
//maybe in onCreate
showDialog(MY_LOADING_DIALOG);
fooThread = new FooThread(handler);
fooThread.start();
これでスレッドが作業を行います。
private class FooThread extends Thread {
Handler mHandler;
FooThread(Handler h) {
mHandler = h;
}
public void run() {
//Do all my work here....you might need a loop for this
Message msg = mHandler.obtainMessage();
Bundle b = new Bundle();
b.putInt("state", 1);
msg.setData(b);
mHandler.sendMessage(msg);
}
}
完了したら、最後に状態をスレッドから取得します。
final Handler handler = new Handler() {
public void handleMessage(Message msg) {
int state = msg.getData().getInt("state");
if (state == 1){
dismissDialog(MY_LOADING_DIALOG);
removeDialog(MY_LOADING_DIALOG);
}
}
};
進捗状況を示すためだけに別のビューを拡大したくない場合は、次の手順を実行します。
Androidはプログレスバーの可視性に注意します。
たとえば、activity_main.xml
では、次のようになります。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical"
tools:context="com.fcchyd.linkletandroid.MainActivity">
<ListView
Android:id="@+id/list_view_xml"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:divider="@color/colorDivider"
Android:dividerHeight="1dp" />
<ProgressBar
Android:id="@+id/loading_progress_xml"
style="?android:attr/progress"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_centerHorizontal="true"
Android:layout_centerVertical="true" />
</RelativeLayout>
そしてMainActivity.Java
では:
package com.fcchyd.linkletandroid;
import Android.os.Bundle;
import Android.support.v7.app.AppCompatActivity;
import Android.util.Log;
import Android.widget.ArrayAdapter;
import Android.widget.ListView;
import Java.util.ArrayList;
import Java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class MainActivity extends AppCompatActivity {
final String debugLogHeader = "Linklet Debug Message";
Call<Links> call;
List<Link> arraylistLink;
ListView linksListV;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
linksListV = (ListView) findViewById(R.id.list_view_xml);
linksListV.setEmptyView(findViewById(R.id.loading_progress_xml));
arraylistLink = new ArrayList<>();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.links.linklet.ml")
.addConverterFactory(GsonConverterFactory
.create())
.build();
HttpsInterface HttpsInterface = retrofit
.create(HttpsInterface.class);
call = HttpsInterface.httpGETpageNumber(1);
call.enqueue(new Callback<Links>() {
@Override
public void onResponse(Call<Links> call, Response<Links> response) {
try {
arraylistLink = response.body().getLinks();
String[] simpletTitlesArray = new String[arraylistLink.size()];
for (int i = 0; i < simpletTitlesArray.length; i++) {
simpletTitlesArray[i] = arraylistLink.get(i).getTitle();
}
ArrayAdapter<String> simpleAdapter = new ArrayAdapter<>(MainActivity.this, Android.R.layout.simple_list_item_1, simpletTitlesArray);
linksListV.setAdapter(simpleAdapter);
} catch (Exception e) {
Log.e("erro", "" + e);
}
}
@Override
public void onFailure(Call<Links> call, Throwable t) {
}
});
}
}
このコードは firebase github samples ..から使用できます。
あなたはレイアウトファイルで編集する必要はありません...ただ新しいクラス "BaseActivity"を作る
package com.example;
import Android.app.ProgressDialog;
import Android.support.annotation.VisibleForTesting;
import Android.support.v7.app.AppCompatActivity;
public class BaseActivity extends AppCompatActivity {
@VisibleForTesting
public ProgressDialog mProgressDialog;
public void showProgressDialog() {
if (mProgressDialog == null) {
mProgressDialog = new ProgressDialog(this);
mProgressDialog.setMessage("Loading ...");
mProgressDialog.setIndeterminate(true);
}
mProgressDialog.show();
}
public void hideProgressDialog() {
if (mProgressDialog != null && mProgressDialog.isShowing()) {
mProgressDialog.dismiss();
}
}
@Override
public void onStop() {
super.onStop();
hideProgressDialog();
}
}
あなたの活動の中であなたが進行状況ダイアログを使用したいのですが..
public class MyActivity extends BaseActivity
時間がかかる機能の前後
showProgressDialog();
.... my code that take some time
showProgressDialog();
Kotlinで開発しているもののために、ProgressDialog
を表示するプロセスを簡単にする Ankoによって提供される甘い方法 ライブラリがあります!
そのリンクに基づいて:
val dialog = progressDialog(message = "Please wait a bit…", title = "Fetching data")
dialog.show()
//....
dialog.dismiss()
これにより、進捗率が表示された進捗状況ダイアログが表示されます(進捗状況を計算するにはinit
パラメータを渡す必要があります)。
indeterminateProgressDialog()
メソッドもあります。これは回転するサークルアニメーションを却下されるまで無期限に提供します。
indeterminateProgressDialog("Loading...").show()
このブログ と叫んで、私はこの解決法に導いた。