美文网首页Android TVAndroid TV开发Android技术知识
[译]Spinner Fragment:显示加载进度条 - An

[译]Spinner Fragment:显示加载进度条 - An

作者: wenju_song | 来源:发表于2017-06-19 17:22 被阅读310次

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

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


    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<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上。
    关注微信公众号,定期为你推荐移动开发相关文章。

    songwenju

    相关文章

      网友评论

        本文标题:[译]Spinner Fragment:显示加载进度条 - An

        本文链接:https://www.haomeiwen.com/subject/txygfxtx.html