Добавление ProgressBar в DetailsOverviewRow на Android TV

Я пытаюсь создать слегка измененную версию android.support.v17.leanback.widget.DetailsOverviewRow для приложения Android TV. Макет, который я пытаюсь выполнить, примерно такой же, как в версии Google по умолчанию, но с добавлением индикатора выполнения над панелью действий. То, что у меня есть сейчас, выглядит так:

Текущая версия

То, что я хочу создать, примерно так:

целевая версия

Я хотел бы добавить это динамически, не создавая совершенно новый макет с нуля, если это возможно. Вот код, который я использую в настоящее время, немного измененный по сравнению с приложением Android TV по умолчанию в Android Studio:

public class VideoDetailsFragment extends DetailsFragment {
private static final String TAG = "VideoDetailsFragment";

private static final int ACTION_UPDATE = 1;
private static final int ACTION_CHANGELOG = 2;
private static final int ACTION_INSTALLED = 3;

private static final int DETAIL_THUMB_WIDTH = 274;
private static final int DETAIL_THUMB_HEIGHT = 274;

private static final int NUM_COLS = 10;

private static final String UPDATE = "Update";

private Update mSelectedUpdate;

private Drawable mDefaultBackground;
private Target mBackgroundTarget;
private DisplayMetrics mMetrics;
private DetailsOverviewRowPresenter mDorPresenter;
private DetailRowBuilderTask mDetailRowBuilderTask;

@Override
public void onCreate(Bundle savedInstanceState) {
    Log.i(TAG, "onCreate DetailsFragment");
    super.onCreate(savedInstanceState);

    mDorPresenter =
            new DetailsOverviewRowPresenter(new DetailsDescriptionPresenter());

    BackgroundManager backgroundManager = BackgroundManager.getInstance(getActivity());
    backgroundManager.attach(getActivity().getWindow());
    mBackgroundTarget = new PicassoBackgroundManagerTarget(backgroundManager);

    mDefaultBackground = getResources().getDrawable(R.drawable.default_background);

    mMetrics = new DisplayMetrics();
    getActivity().getWindowManager().getDefaultDisplay().getMetrics(mMetrics);

    List<Update> list = UpdateList.setupMovies();
    mSelectedUpdate = list.get(0);//(Update) getActivity().getIntent().getSerializableExtra(MOVIE);
    mDetailRowBuilderTask = (DetailRowBuilderTask) new DetailRowBuilderTask().execute(list);
    mDorPresenter.setSharedElementEnterTransition(getActivity(),
            DetailsActivity.SHARED_ELEMENT_NAME);

    setOnItemViewClickedListener(new ItemViewClickedListener());

}

@Override
public void onStop() {
    mDetailRowBuilderTask.cancel(true);
    super.onStop();
}

private class DetailRowBuilderTask extends AsyncTask<List<Update>, Integer, List<DetailsOverviewRow>> {
    @Override
    protected List<DetailsOverviewRow> doInBackground(List<Update>... movies) {
        List<DetailsOverviewRow> rows = new ArrayList<DetailsOverviewRow>();

        int exampleUpdate = 0;

        for (Update m: movies[0]) {
            DetailsOverviewRow row = new DetailsOverviewRow(m);
            try {
                //String test = mSelectedUpdate.getCardImageUrl();
                Bitmap poster = Picasso.with(getActivity())
                        .load(m.getCardImageUrl())
                        .resize(Utils.convertDpToPixel(getActivity().getApplicationContext(), DETAIL_THUMB_WIDTH),
                                Utils.convertDpToPixel(getActivity().getApplicationContext(), DETAIL_THUMB_HEIGHT))
                        .centerCrop()
                        .get();
                row.setImageBitmap(getActivity(), poster);
            } catch (IOException e) {
                e.printStackTrace();
                Log.e(TAG, e.toString(), e);
            }

            SparseArrayObjectAdapter adapter = new SparseArrayObjectAdapter();
            if (exampleUpdate++ == 0) {
                Action a1 = new Action(ACTION_UPDATE, getResources().getString(R.string.download));
                Action a2 = new Action(ACTION_CHANGELOG, getResources().getString(R.string.release_notes));
                adapter.set(ACTION_UPDATE, a1);
                adapter.set(ACTION_CHANGELOG, a2);
                row.setActionsAdapter(adapter);
            }else{
                Action a1 = new Action(ACTION_INSTALLED, getResources().getString(
                        R.string.installed));
                Action a2 = new Action(ACTION_CHANGELOG, getResources().getString(R.string.release_notes));
                //ProgressBar p1 = new ProgressBar(getActivity(),null, android.R.attr.progressBarStyleHorizontal);
                adapter.set(1, a1);
                adapter.set(2, a2);
                //adapter.set(3, p1);
                row.setActionsAdapter(adapter);
            }
            rows.add(row);
        }
        return rows;
    }

    @Override
    protected void onPostExecute(List<DetailsOverviewRow> detailRows) {
        ClassPresenterSelector ps = new ClassPresenterSelector();
        // set detail background and style

        mDorPresenter.setBackgroundColor(getResources().getColor(R.color.black_opaque));
        Log.i("TEST", "Setting BG Color of Detail View");
        mDorPresenter.setStyleLarge(true);
        mDorPresenter.setOnActionClickedListener(new OnActionClickedListener() {
            @Override
            public void onActionClicked(Action action) {
                if (action.getId() == ACTION_UPDATE) {
                    /*Intent intent = new Intent(getActivity(), PlaybackOverlayActivity.class);
                    intent.putExtra(getResources().getString(R.string.movie), mSelectedUpdate);
                    intent.putExtra(getResources().getString(R.string.should_start), true);
                    startActivity(intent);*/
                    Toast.makeText(getActivity(), "Download Update", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(getActivity(), action.toString(), Toast.LENGTH_SHORT).show();
                }
            }
        });

        ps.addClassPresenter(DetailsOverviewRow.class, mDorPresenter);
        ps.addClassPresenter(ListRow.class,
                new ListRowPresenter());


        ArrayObjectAdapter adapter = new ArrayObjectAdapter(ps);

        for(DetailsOverviewRow detailRow : detailRows){
            adapter.add(detailRow);
        }

        String subcategories[] = {
                getString(R.string.related_movies)
        };

        //HeaderItem header = new HeaderItem(0, subcategories[0]);
        //adapter.add(new ListRow(header, listRowAdapter));

        setAdapter(adapter);
    }

}

private final class ItemViewClickedListener implements OnItemViewClickedListener {
    @Override
    public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
                              RowPresenter.ViewHolder rowViewHolder, Row row) {

        if (item instanceof Update) {
            Update update = (Update) item;
            Log.d(TAG, "Item: " + item.toString());
            Intent intent = new Intent(getActivity(), DetailsActivity.class);
            intent.putExtra(DetailsActivity.MOVIE, update);

            Bundle bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(
                    getActivity(),
                    ((ImageCardView) itemViewHolder.view).getMainImageView(),
                    DetailsActivity.SHARED_ELEMENT_NAME).toBundle();
            getActivity().startActivity(intent, bundle);
        }
    }
}


}

Есть ли простой способ добавить ProgressBar или мне нужно создать совершенно новый макет xml для этого?


person user2079043    schedule 04.06.2015    source источник
comment
Можете ли вы получить доступ к исходному файлу XML и вручную добавить панель?   -  person Tukajo    schedule 04.06.2015
comment
Я не уверен, где я мог бы найти файл. Я могу получить сгенерированный файл R для библиотеки android.support.v17.leanback, но я не уверен, есть ли файлы xml.   -  person user2079043    schedule 04.06.2015


Ответы (1)


Я придумал способ сделать это. В итоге я создал модифицированную версию lb_details_overview.xml, которая используется библиотекой support.v17.leanback при создании DetailOverviewRow. Я просто добавил RelativeLayout с ProgressBar. Мне также пришлось сделать модифицированную версию DetailsOverviewRowPresenter.java в библиотеке Leanback, чтобы раздуть новый макет xml вместо существующего. Возможно, это не лучший и не самый простой способ сделать это, но он работает.

person user2079043    schedule 05.06.2015
comment
Есть ли шанс, что вы можете поделиться им? - person Thiago; 06.06.2015
comment
в каком методе вы раздули XML-макет? Я вижу, что createRowViewHolder звонит частному initDetailsOverView(). Вам пришлось воссоздать последний частный метод? - person kip2; 29.03.2016
comment
Не могли бы вы поделиться своим измененным макетом и классом Presenter? - person khateeb; 24.11.2017