2015-01-22 17 views
8

Kart seçildiğinde, infoArea öğesinin arka plan rengini Android Leanback Kitaplığı'nda bir ImageCardView üzerinde değiştirmeye çalışıyorum. Şu anda denediğim şey arka planı OnItemViewSelectedListener'da değiştirmektir. Bu arka planı değiştirir, ancak daha önce seçilen öğeyi temizlemez.ImageCardView'da bilgi alanının arka plan rengi nasıl değiştirilir?

desired effect

Herhangi fikirleri:

private final class ItemViewSelectedListener implements OnItemViewSelectedListener { 
     @Override 
     public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item, 
            RowPresenter.ViewHolder rowViewHolder, Row row) { 
      if (item instanceof Video) { 
       mBackgroundURI = ((Video) item).getBackgroundImageURI(); 
       startBackgroundTimer(); 
       ((ImageCardView) itemViewHolder.view) 
         .setInfoAreaBackgroundColor(getResources().getColor(R.color.dark_blue_grey)); 
      } 
     } 
    } 

Böyle bir şey elde etmek istersiniz? Teşekkürler.

cevap

5

Şu anda seçili olan görünümü takip ettiğim ve daha sonra arka plan alanını değiştirdiğim daha basit bir çözüm buldum.

private final class ItemViewSelectedListener implements OnItemViewSelectedListener { 

     private ImageCardView currentlySelectedView = null; 

     @Override 
     public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item, 
            RowPresenter.ViewHolder rowViewHolder, Row row) { 
      if (item instanceof Video) { 
       mBackgroundURI = ((Video) item).getBackgroundImageURI(); 
       startBackgroundTimer(); 

       if (currentlySelectedView != null) { 
        currentlySelectedView.setInfoAreaBackgroundColor(
          getResources().getColor(R.color.lb_basic_card_info_bg_color)); 
       } 

       currentlySelectedView = (ImageCardView) itemViewHolder.view; 
       currentlySelectedView 
         .setInfoAreaBackgroundColor(getResources().getColor(R.color.dark_blue_grey)); 
      } 
     } 
    } 
4

Bunu, özel olarak seçilmiş bir rengi korumak için ImageCardView öğesini genişleterek başardım.

public static class CustomImageCardView extends ImageCardView { 

    private int mColor; 

    public CustomImageCardView(Context context) { 
     super(context); 
    } 

    public CustomImageCardView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public CustomImageCardView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    public int getCustomSelectedSwatch() { 
     return mColor; 
    } 

    public void setCustomColor(int color) { 
     mColor = color; 
    } 
} 

Varsayılan arka plan rengini ve varsayılan seçili rengi sunucumdaki üye değişkenleri olarak koruyorum.

private final int mDefaultInfoBackgroundColor; 
private final int mDefaultSelectedInfoBackgroundColor; 

Ve kart resmi görüş setSelected yöntemini geçersiz:

@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent) { 
    mContext = parent.getContext(); 

    final CustomImageCardView cardView = new CustomImageCardView(mContext) { 
     @Override 
     public void setSelected(boolean selected) { 
      if (getCustomColor() != 0 && selected) { 
       setInfoAreaBackgroundColor(getCustomColor()); 
      } else setInfoAreaBackgroundColor(selected ? mDefaultSelectedInfoBackgroundColor : mDefaultInfoBackgroundColor); 
      super.setSelected(selected); 
     } 
    }; 

    cardView.setFocusable(true); 
    cardView.setFocusableInTouchMode(true); 
    return new ViewHolder(cardView); 
} 

Herhangi bir sorunuz olursa bize bildirin!

0

dinamik odaklı kart görüşlerin görsel stiller değiştirmek isterseniz, size ImageCardView üzerinde OnFocusChangeListener ayarlayabilirsiniz. Tam örnek Google Samples leanback-showcase projesinde bulunabilir. Burada örneğin,

@Override 
public Presenter.ViewHolder onCreateViewHolder(ViewGroup parent) { 
    Context context = parent.getContext(); 

    ImageCardView cardView = new ImageCardView(context); 
    cardView.setFocusable(true); 
    cardView.setFocusableInTouchMode(true); 

    cardView.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 
      if (hasFocus) { 
       // Set bg color for the whole card 
       cardView.setBackgroundColor(ContextCompat.getColor(context, R.color.FOCUSED_COLOR)); 
       // Set bg color for the info area only 
       cardView.setInfoAreaBackgroundColor(ContextCompat.getColor(context, R.color.FOCUSED_COLOR)); 
       // Set title text color 
       ((TextView) cardView.findViewById(R.id.title_text)).setTextColor(ContextCompat.getColor(context, R.color.FOCUSED_COLOR)); 
       // Set description text color 
       ((TextView) cardView.findViewById(R.id.content_text)).setTextColor(ContextCompat.getColor(context, R.color.FOCUSED_COLOR)); 
      } 
      else { 
       cardView.setBackgroundColor(ContextCompat.getColor(context, R.color.NORMAL_COLOR)); 
       cardView.setInfoAreaBackgroundColor(ContextCompat.getColor(context, R.color.NORMAL_COLOR)); 
       ((TextView) cardView.findViewById(R.id.title_text)).setTextColor(ContextCompat.getColor(context, R.color.NORMAL_COLOR)); 
       ((TextView) cardView.findViewById(R.id.content_text)).setTextColor(ContextCompat.getColor(context, R.color.NORMAL_COLOR)); 
      } 
     } 
    }); 

    return new ViewHolder(cardView); 
} 

, tüm kartın alt görüşlerin doğru düzen kimliklerini almak XML kaynağındaki bakmak için::

Bu ImageCardViewPresenter sınıfında, kısa bir örnektir böyle bir şey koymak lb_image_card_view.xml

İlgili konular