版权声明:本文为博主原创翻译文章,转载请注明出处。
推荐:
欢迎关注我创建的Android TV 专题,会定期给大家分享一些AndroidTv相关的内容:
https://www.jianshu.com/c/3f0ab61a1322
在本教程的附录中,我将介绍有用的Android通用库和函数。 这些通常不仅适用于Android TV,还适用于Android手机/平板电脑设备。
Spinner Fragment - 显示加载进度条
当用户正在从网页下载大量内容时,您可能希望显示进度条以通知用户某些进程(此时下载)正在后台完成。 它有助于导航用户等待此过程。
在这里,SpinnerFragment可用于显示圆圈箭头进度条。 通过右键单击“ui”包→[新建]→[Java类]→将名称设置为“SpinnerFragment”开始。
这个类是Fragment的一个子类,它只是在onCreateView中制作ProgressBar
import android.app.Fragment;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ProgressBar;
/**
* SpinnerFragment shows spinning progressbar to notify user that
* application is processing something (while downloading, or preparing sth etc.)
*
* Example of usage in AsyncTask
* + Start showing: OnPreExecute
* mSpinnerFragment = new SpinnerFragment();
* getFragmentManager().beginTransaction().add(R.id.some_view_group, mSpinnerFragment).commit();
* + Stop showing: OnPostExecute
* getFragmentManager().beginTransaction().remove(mSpinnerFragment).commit();
*/
public class SpinnerFragment extends Fragment {
private static final String TAG = SpinnerFragment.class.getSimpleName();
private static final int SPINNER_WIDTH = 100;
private static final int SPINNER_HEIGHT = 100;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
ProgressBar progressBar = new ProgressBar(container.getContext());
if (container instanceof FrameLayout) {
FrameLayout.LayoutParams layoutParams =
new FrameLayout.LayoutParams(SPINNER_WIDTH, SPINNER_HEIGHT, Gravity.CENTER);
progressBar.setLayoutParams(layoutParams);
}
return progressBar;
}
}
Spinner Fragment的使用 - AsyncTask
将按钮放在MainFragment中
要介绍SpinnerFragment的使用,请使按钮显示此Fragment。 我将在MainFragment中创建“Spinner”按钮。
public class MainFragment extends BrowseFragment {
...
private static final String GRID_STRING_SPINNER = "Spinner";
...
private void loadRows() {
mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter());
/* GridItemPresenter */
HeaderItem gridItemPresenterHeader = new HeaderItem(0, "GridItemPresenter");
GridItemPresenter mGridPresenter = new GridItemPresenter();
ArrayObjectAdapter gridRowAdapter = new ArrayObjectAdapter(mGridPresenter);
gridRowAdapter.add(GRID_STRING_ERROR_FRAGMENT);
gridRowAdapter.add(GRID_STRING_GUIDED_STEP_FRAGMENT);
gridRowAdapter.add(GRID_STRING_RECOMMENDATION);
gridRowAdapter.add(GRID_STRING_SPINNER);
mRowsAdapter.add(new ListRow(gridItemPresenterHeader, gridRowAdapter));
...
/* Set */
setAdapter(mRowsAdapter);
}
...
private final class ItemViewClickedListener implements OnItemViewClickedListener {
@Override
public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
RowPresenter.ViewHolder rowViewHolder, Row row) {
...
} else if (item == GRID_STRING_SPINNER) {
// Show SpinnerFragment, while doing some is executed.
new ShowSpinnerTask().execute();
}
}
}
}
点击“Spinner”按钮后,ShowSpinnerTask启动,这将在下面解释。
AsyncTask实现
SpinnerFragment的用例是在后台处理某些东西时,AsyncTask是在后台执行某些操作的常用选项。
下面,ShowSpinnerTask作为MainFragment的内部类引入。 它是如何使用SpinnerFragment的模拟示例。 SpinnerFragment在后台进程启动(onPreExecute)之前添加到MainFragment中,并在后台进程完成(onPostExecute)之后被删除。 此添加和删除是通过使用FragmentManager完成的。
添加和删除SpinnerFragment就足够了。 我们不需要指定任何动画,并且在后台进程中需要UI更新过程。
在add方法的第一个参数中,我们需要指定ViewGroup的布局ID来附加SpinnerFragment。 在这个例子中,使用了main_browse_fragment。
private class ShowSpinnerTask extends AsyncTask {
SpinnerFragment mSpinnerFragment;
@Override
protected void onPreExecute() {
mSpinnerFragment = new SpinnerFragment();
getFragmentManager().beginTransaction().add(R.id.main_browse_fragment, mSpinnerFragment).commit();
}
@Override
protected Void doInBackground(Void... params) {
// Do some background process here.
// It just waits 5 sec in this Tutorial
SystemClock.sleep(5000);
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
getFragmentManager().beginTransaction().remove(mSpinnerFragment).commit();
}
}
当按下“Spinner”按钮时,会出现圆形进度条。
源代码在github上。
关注微信公众号,定期为你推荐移动开发相关文章。