web-dev-qa-db-ja.com

読み込み中にImageViewで「アニメの円」を使用する

私は現在、私のアプリケーションでリストビューを使用しています。リストビューを表示するにはおそらく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..."/>

さて、このテキストの代わりにローディングダイアログで使われているアニメーションサークルでそれを置き換えたいと思います、私はあなたが私が何を意味するか知っていると思います:

編集:私はダイアログが欲しくありません。私は自分のレイアウトの中にそれを見せたいのです。

http://flexfwd.com/DesktopModules/ATI_Base/resources/images/loading_blue_circle.gif

どうもありがとうございました。

201
Waza_Be

アクティビティのレイアウトファイルにこの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);

その結果(そしてそれもまた回転します):

enter image description here

390
user1032613

次の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 を使ってください。

141
Kurru

これは一般に不確定 進捗バー または不確定進捗ダイアログと呼ばれます。

これを 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);
        }
    }
};
10
user432209

進捗状況を示すためだけに別のビューを拡大したくない場合は、次の手順を実行します。

  1. リストビューと同じXMLレイアウトでProgressBarを作成します。
  2. 中心にする
  3. それにidを与えなさい
  4. SetEmptyViewを呼び出して、それをあなたのlistviewインスタンス変数に添付してください。

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) {

        }
    });


}

}

1
Md_Zubair Ahmed

このコードは 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();
1
khateeb

Kotlinで開発しているもののために、ProgressDialogを表示するプロセスを簡単にする Ankoによって提供される甘い方法 ライブラリがあります!

そのリンクに基づいて:

val dialog = progressDialog(message = "Please wait a bit…", title = "Fetching data")
dialog.show()
//....
dialog.dismiss()

これにより、進捗率が表示された進捗状況ダイアログが表示されます(進捗状況を計算するにはinitパラメータを渡す必要があります)。

indeterminateProgressDialog()メソッドもあります。これは回転するサークルアニメーションを却下されるまで無期限に提供します。

indeterminateProgressDialog("Loading...").show()

このブログ と叫んで、私はこの解決法に導いた。

0
DarkCygnus