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

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

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


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

转载于:https://juejin.im/post/5b714cb3518825610c3f6a0e

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值