在加载东西时在ImageView中使用“动画圆圈”

时间:2011-03-26 12:03:24

标签: android loading android-asynctask geometry

我目前正在我的应用程序中使用一个列表视图,可能需要一秒钟才能显示。

我目前所做的是使用listview的@ 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

非常感谢你的帮助!

6 个答案:

答案 0 :(得分:388)

只需将此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

答案 1 :(得分:141)

您可以使用以下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>

要使用此功能,您必须通过将可见性值设置为GONE来隐藏UI元素,并且无论何时加载数据,请在所有视图上调用setVisibility(View.VISIBLE)以恢复它们。不要忘记致电findViewById(R.id.loadingPanel).setVisiblity(View.GONE)来隐藏加载动画。

如果您没有加载事件/功能但只是希望加载面板在x秒后消失,请使用Handle来触发隐藏/显示。

答案 2 :(得分:10)

这通常被称为不确定Progress Bar或不确定进度对话。

将其与ThreadHandler结合使用可获得您想要的效果。有很多关于如何通过Google或在此处进行此操作的示例。我强烈建议花时间学习如何使用这种类组合来执行这样的任务。它在许多类型的应用程序中都非常有用,可以让您深入了解线程和处理程序如何协同工作。

我会让你开始研究它是如何工作的:

加载事件启动对话框:

//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);
        }
    }
};

答案 3 :(得分:1)

如果您不想仅仅为了表明进展而膨胀另一个视图,请执行以下操作:

  1. 在列表视图的相同XML布局中创建ProgressBar。
  2. 让它居中
  3. 给它一个id
  4. 通过调用setEmptyView
  5. 将其附加到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) {
    
            }
        });
    
    
    }
    

    }

答案 4 :(得分:1)

您可以使用firebase github samples ..

中的此代码

您不需要在布局文件中进行编辑...只需创建一个新类&#34; BaseActivity&#34;

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();

答案 5 :(得分:0)

对于那些在Kotlin中开发的开发人员来说,有一个sweet method provided by the Anko库可以使显示ProgressDialog的过程变得轻而易举!

基于该链接:

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

这将显示一个进度对话框,其中显示进度百分比(为此您还必须传递init参数来计算进度)。

还有一种indeterminateProgressDialog()方法,该方法可以无限期提供Spinning Circle动画,直到将其关闭:

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

高喊this blog,这使我想到了这个解决方案。