2015-01-22 5 views
8

Ich versuche, die Hintergrundfarbe der InfoArea auf einem ImageCardView in der Android Leanback Library zu ändern, wenn die Karte ausgewählt ist. Momentan habe ich versucht, den Hintergrund im OnItemViewSelectedListener zu ändern. Dadurch wird der Hintergrund geändert, das zuvor ausgewählte Element wird jedoch nicht gelöscht.Wie ändere ich die Hintergrundfarbe des Infobereichs in einer ImageCardView?

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)); 
      } 
     } 
    } 

Ich möchte so etwas wie dieses Ziel erreichen:

desired effect

Irgendwelche Ideen? Vielen Dank.

Antwort

5

Ich fand eine einfachere Lösung, wo ich nur die Ansicht, die gerade ausgewählt ist, verfolgen und dann den Hintergrundbereich basierend darauf ändern.

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

Ich habe dies erreicht, indem ich die ImageCardView erweitert habe, um eine benutzerdefinierte Farbe zu halten.

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; 
    } 
} 

Ich verwalte die Standardhintergrundfarbe und die voreingestellte Farbe als Elementvariablen in meinem Presenter.

private final int mDefaultInfoBackgroundColor; 
private final int mDefaultSelectedInfoBackgroundColor; 

Und überschreibt die setSelected Methode der Kartenbildansicht:

@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); 
} 

Lassen Sie mich wissen, wenn Sie irgendwelche Fragen haben!

0

Wenn Sie möchten, um dynamisch visuelle Stile fokussierter Karte Ansichten ändern, könnten Sie OnFocusChangeListener auf ImageCardView gesetzt. Das vollständige Beispiel finden Sie in Google Samples leanback-showcase Projekt.

Dies ist ein kurzes Beispiel in Ihrer ImageCardViewPresenter Klasse setzen diese so etwas wie:

@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); 
} 

Um die richtige Layout-IDs aller Karten des Kindes Ansichten zu erhalten, in XML-Quelle suchen, zum Beispiel hier: lb_image_card_view.xml