[译]Spinner Fragment:显示加载进度条 - Android TV应用程序手册教程附录A

版权声明:本文为博主原创翻译文章,转载请注明出处。

推荐:
欢迎关注我创建的Android TV 专题,会定期给大家分享一些AndroidTv相关的内容:
https://www.jianshu.com/c/3f0ab61a1322


[译]Spinner Fragment:显示加载进度条 - Android TV应用程序手册教程附录A_第1张图片
spinner

在本教程的附录中,我将介绍有用的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上。
关注微信公众号,定期为你推荐移动开发相关文章。

[译]Spinner Fragment:显示加载进度条 - Android TV应用程序手册教程附录A_第2张图片
songwenju

你可能感兴趣的:([译]Spinner Fragment:显示加载进度条 - Android TV应用程序手册教程附录A)