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

我目前做的是使用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..."/>

现在,我想用加载对话框中使用的动画圈代替这段文字,我猜你们都知道我的意思:

编辑:我不想要对话框。我想在布局中展示一下。

非常感谢你的帮助!


当前回答

你可以使用这个代码从firebase github样本..

你不需要在布局文件中编辑…新建一个类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中开发的,有一个由Anko库提供的甜蜜方法,使显示ProgressDialog的过程变得轻而易举!

基于这个链接:

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

这将显示一个显示进度%的进度对话框(为此,您必须传递init参数来计算进度)。

还有indeterminateProgressDialog()方法,它无限期地提供旋转的圆圈动画,直到被驳回:

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

大声喊出这个博客,它让我找到了这个解决方案。

您可以通过使用下面的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). setvisibility (View.GONE)来隐藏加载动画。

如果你没有加载事件/函数,只是想要加载面板在x秒后消失,使用句柄来触发隐藏/显示。

简单地把这个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);

结果(它也旋转):

这通常被称为不确定进度条或不确定进度对话框。

将它与线程和处理程序结合起来,就可以得到你想要的东西。有很多例子是关于如何通过谷歌或这里的SO来做到这一点。我强烈建议花时间学习如何使用类的组合来执行这样的任务。它在许多类型的应用程序中都非常有用,并将让您深入了解线程和处理程序如何协同工作。

我会告诉你这是如何运作的:

加载事件启动对话框:

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

你可以使用这个代码从firebase github样本..

你不需要在布局文件中编辑…新建一个类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();