2015-06-04 2 views
2

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

Current Version

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

Goal Version

Я хотел бы добавить это динамически, без необходимости создания совершенно новый макет с нуля если возможно. Вот код, я использую в настоящее время, немного редактировался по умолчанию приложение телевизора Android в 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, чтобы сделать это?

+0

Можете ли вы получить доступ к исходному XML-файлу и вручную добавить панель? – Tukajo

+0

Я не уверен, где найти файл. Я могу перейти к сгенерированному файлу R для библиотеки android.support.v17.leanback, но я не уверен, есть ли там файлы xml. – user2079043

ответ

2

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

+2

Есть ли шанс поделиться им? – Thiago

+0

, в каком методе вы раздували XML-макет? Я вижу, что 'createRowViewHolder' вызывает private' initDetailsOverView() '. Вам нужно было воссоздать последний частный метод? – kip2

+0

Coudl вы делитесь своим измененным макетом и классом Presenter? – khateeb