如何实现不确定的加载屏幕
How to implement indeterminate loading screen
我正在构建一个使用 REST 接口获取数据的应用程序。通常,我会调用 setProgressBarIndeterminateVisibility(true);
让用户知道应用正在等待数据。然而,这似乎是 deprecated:
Progress bars are no longer provided in AppCompat.
在查看 GMail 应用程序时,我看到有一个不确定的进度条(加载图标)全屏,数据即将到来。
我该如何正确实施?一些活动是从 ListViewActivity
扩展而来的,并在没有可用数据时使用 setEmptyView
显示简单的 TextView
。有些是更精细的布局。
我可以考虑使用 setVisibility(View.GONE)
,但想知道这是否是 "right" 的方法。
是的。这是正确的方法。只需将所有内容布置在 XML 上应有的位置,并在必要时在进度条上调用 setVisibility
。
知道"when"调用的方法通常有两种。
- 关于您的 REST 回调(例如
onSuccess()
、onStartLoading()
)
- 在您的适配器上使用 DataSetObserver(这正是
ListView
所做的)。喜欢下面的代码:
.
@Override
protected void onStart(){
super.onStart()
observer.onChanged();
adapter.registerDataSetObserver(observer);
}
@Override
protected void onStop(){
super.onStop()
adapter.unregisterDataSetObserver(observer);
}
private DataSetObserver observer = new DataSetObserver(){
@Override
public void onChanged() {
progress.setVisibility(adapter.getCount()==0?View.VISIBLE:View.GONE);
}
}
将您的内容布局包装到 FrameLayout
中。添加到 FrameLayout
类似这样的内容:
<LinearLayout
android:id="@+id/loading_progress"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
android:visibility="invisible">
<ProgressBar
android:layout_width="50dp"
android:layout_height="50dp"
android:indeterminate="true"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="Loading data..."/>
</LinearLayout>
然后使用 .setVisibility(View.VISIBLE) / .setVisibility(View.INVISIBLE)
在代码中切换内容/进度层
我正在构建一个使用 REST 接口获取数据的应用程序。通常,我会调用 setProgressBarIndeterminateVisibility(true);
让用户知道应用正在等待数据。然而,这似乎是 deprecated:
Progress bars are no longer provided in AppCompat.
在查看 GMail 应用程序时,我看到有一个不确定的进度条(加载图标)全屏,数据即将到来。
我该如何正确实施?一些活动是从 ListViewActivity
扩展而来的,并在没有可用数据时使用 setEmptyView
显示简单的 TextView
。有些是更精细的布局。
我可以考虑使用 setVisibility(View.GONE)
,但想知道这是否是 "right" 的方法。
是的。这是正确的方法。只需将所有内容布置在 XML 上应有的位置,并在必要时在进度条上调用 setVisibility
。
知道"when"调用的方法通常有两种。
- 关于您的 REST 回调(例如
onSuccess()
、onStartLoading()
) - 在您的适配器上使用 DataSetObserver(这正是
ListView
所做的)。喜欢下面的代码:
.
@Override
protected void onStart(){
super.onStart()
observer.onChanged();
adapter.registerDataSetObserver(observer);
}
@Override
protected void onStop(){
super.onStop()
adapter.unregisterDataSetObserver(observer);
}
private DataSetObserver observer = new DataSetObserver(){
@Override
public void onChanged() {
progress.setVisibility(adapter.getCount()==0?View.VISIBLE:View.GONE);
}
}
将您的内容布局包装到 FrameLayout
中。添加到 FrameLayout
类似这样的内容:
<LinearLayout
android:id="@+id/loading_progress"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
android:visibility="invisible">
<ProgressBar
android:layout_width="50dp"
android:layout_height="50dp"
android:indeterminate="true"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="Loading data..."/>
</LinearLayout>
然后使用 .setVisibility(View.VISIBLE) / .setVisibility(View.INVISIBLE)