2015-01-22 7 views
8

मैं कार्ड का चयन करते समय एंड्रॉइड लीनबैक लाइब्रेरी में ImageCardView पर जानकारी एरिया के पृष्ठभूमि रंग को बदलने की कोशिश कर रहा हूं। वर्तमान में मैंने जो कोशिश की है वह OnItemViewSelectedListener में पृष्ठभूमि को बदल रहा है। यह पृष्ठभूमि को बदलता है, लेकिन फिर पहले चयनित आइटम को साफ़ नहीं करता है।ImageCardView पर जानकारी क्षेत्र के पृष्ठभूमि रंग को कैसे बदला जाए?

desired effect

कोई भी विचार:

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

मैं कुछ इस तरह प्राप्त करने के लिए चाहते हैं? धन्यवाद।

उत्तर

5

मुझे एक आसान समाधान मिला जहां मैं वर्तमान में चयनित दृश्य का ट्रैक रखता हूं और उसके बाद पृष्ठभूमि क्षेत्र को बदलता हूं।

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

मैंने कस्टम चयनित रंग रखने के लिए ImageCardView को विस्तारित करके इसे हासिल किया।

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

मैं अपने प्रस्तुतकर्ता में सदस्य चर के रूप में डिफ़ॉल्ट पृष्ठभूमि रंग, और डिफ़ॉल्ट चयनित रंग बनाए रखता हूं।

private final int mDefaultInfoBackgroundColor; 
private final int mDefaultSelectedInfoBackgroundColor; 

और कार्ड छवि को देखने के setSelected विधि ओवरराइड:

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

मुझे पता है कि आप किसी भी प्रश्न हैं, तो करते हैं!

0

आप गतिशील रूप से ध्यान केंद्रित कार्ड विचारों का दृश्य शैलियों में परिवर्तन करना चाहते हैं, तो आप अपने ImageCardView पर OnFocusChangeListener सेट कर सकते हैं। पूरा उदाहरण Google Samples leanback-showcase प्रोजेक्ट में पाया जा सकता है।

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

सभी कार्ड के बच्चे विचारों का उचित लेआउट आईडी प्राप्त करने के लिए, XML स्रोत में देखो, यहाँ उदाहरण के लिए::

यह एक छोटा उदाहरण के लिए, अपने ImageCardViewPresenter कक्षा में है कुछ इस तरह डाल lb_image_card_view.xml

संबंधित मुद्दे

 संबंधित मुद्दे