2015-11-04 10 views
8

मेरा लक्ष्य एक एंड्रॉइड लाइब्रेरी ढूंढना है जो मुझे सरणी के आधार पर कैलेंडर दृश्य पर विभिन्न तिथियों को चिह्नित करने की अनुमति देगा। तिथियां संगत हो सकती हैं या नहीं भी हो सकती हैं। मेरा आदर्श परिदृश्य प्रत्येक तारीख के पृष्ठभूमि रंग को बदलना है। महत्वपूर्ण जटिलता यह है कि मुझे रनटाइम तक यह रंग नहीं पता है, क्योंकि यह सर्वर क्वेरी से आएगा।सामग्री-कैलेंडरदृश्य दिनांकों का पृष्ठभूमि रंग सेट

मैं इस दिन शोध कर रहा हूं, और मेरी सबसे अच्छी उम्मीद material-calendarview (github) प्रतीत होती है। हालांकि, मुझे उनके कोड को कुछ हद तक अभेद्य पाया जा रहा है, जो मुझ पर है, लेकिन मैं पूरी तरह से अटक गया हूं।

मैं अपने एक्सएमएल लेआउट में इस तरह एक कैलेंडर जोड़ दिया है:

<com.prolificinteractive.materialcalendarview.MaterialCalendarView 
     android:id="@+id/calendar_view" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_marginLeft="20dp" 
     android:layout_marginRight="20dp" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     app:mcv_showOtherDates="all" 
     app:mcv_selectionColor="#00F"/> 

और फिर मेरी गतिविधि में, मैं इन उदाहरण चर है:

private MaterialCalendarView calendarView; 
private ArrayList<Date> markedDates; 

और मेरे onCreateView()

में इस कोड
calendarView = (MaterialCalendarView) view.findViewById(R.id.calendar_view); 

ठीक है, काफी आसान है। लेकिन मैं यह नहीं समझ सकता कि कैलेंडर को मेरी तिथियों से कैसे चिह्नित किया जाए। मैं इस पद्धति पर काम कर रहा हूँ, लेकिन मैं तो बस नहीं पता है कि मैं यहाँ है परे आगे बढ़ने के लिए कैसे: अंतिम पंक्ति इस आंतरिक श्रेणी को संदर्भित करता

private void initializeCalendar() { 

     calendarView.setOnDateChangedListener(context); 
     calendarView.setShowOtherDates(MaterialCalendarView.SHOW_ALL); 

     Calendar calendar = Calendar.getInstance(); 
     calendarView.setSelectedDate(calendar.getTime()); 

     calendar.set(calendar.get(Calendar.YEAR), Calendar.JANUARY, 1); 
     calendarView.setMinimumDate(calendar.getTime()); 

     calendar.set(calendar.get(Calendar.YEAR), Calendar.DECEMBER, 31); 
     calendarView.setMaximumDate(calendar.getTime()); 

     int bgColor = sharedVisualElements.getPrimaryColor(); 

     calendarView.addDecorators(new EventDecorator(bgColor, ????)); 
} 

कि:

private class EventDecorator implements DayViewDecorator { 

     private final int color; 
     private final HashSet<CalendarDay> dates; 

     public EventDecorator(int color, Collection<CalendarDay> dates) { 
      this.color = color; 
      this.dates = new HashSet<>(dates); 
     } 

     @Override 
     public boolean shouldDecorate(CalendarDay day) { 
      return dates.contains(day); 
     } 

     @Override 
     public void decorate(DayViewFacade view) { 
      view.addSpan(new DotSpan(5, color)); 
     } 
    } 

मुझे लगता है कि लगता है कि मेरी मेरे ArrayList<Date> markedDates को Collection<CalendarDay> dates पर कॉल करने के लिए चुनौती देने के लिए चुनौती। इस बात से सहमत? लेकिन यह वह जगह है जहां मैं वास्तव में नीचे गिर गया। यह data structure मेरे लिए विचित्र है। जब मैं new CalendarDay() पर कॉल करके इसे तुरंत चालू करने का प्रयास करता हूं तो मेरी कक्षा तुरंत 10 नई विधियों के साथ फैली हुई है जिन्हें मैं उनकी भूमिका नहीं समझता या उनके साथ क्या करना है। जाहिर है, मैं यहां रेलों से बाहर जा रहा हूं। यह सिर्फ यह मुश्किल नहीं हो सकता है।

क्या किसी ने इस उद्देश्य के लिए इस पुस्तकालय का उपयोग किया है और यह पता है कि इस कार्य को कैसे पूरा किया जाए? मैं पीसने वाली रोक में हूं। साथ ही, यदि एक सरल लाइब्रेरी है जो मुझे रंगीन रंगों को केवल रंग-समय पर ज्ञात रंग का उपयोग करने की अनुमति देने के लिए अनुमति देती है, तो मैं सभी कान हूं।

किसी भी मदद के लिए धन्यवाद। मुझे डर है कि मैंने इसे भ्रमित तरीके से लिखा है, जो इस तथ्य का नतीजा है कि मैं पूरी तरह उलझन में हूं।

उत्तर

3

मैंने इसे हल किया, इसलिए अगर मैं किसी और के पास एक ही प्रश्न पूछूं तो मैं उस समाधान को पोस्ट करूंगा। यदि कोई अधिक प्रभावी तरीका है, तो कृपया समाधान के रूप में पोस्ट करें।

मैंने उल्लेख किया कि मेरे पास तिथियों की एक सूची है। मुझे उस सरणी पर फिर से चलाना है, प्रत्येक Date को Calendar ऑब्जेक्ट में उपयुक्त वर्ष, महीने और दिन में सेट किया गया है, और उसके बाद उस ऑब्जेक्ट को ArrayList पर जोड़कर, ArrayList<CalendarDay> पर जोड़ना है। उदाहरण के लिए:

List<CalendarDay> list = new ArrayList<CalendarDay>(); 
Calendar calendar = Calendar.getInstance(); 

for (Date date : markedDates) { 
    // might be a more elegant way to do this part, but this is very explicit 
    int year = date.getYear(); 
    int month = date.getMonthOfYear() - 1; // months are 0-based in Calendar 
    int day = date.getDayOfMonth(); 

    calendar.set(year, month, day); 
    CalendarDay calendarDay = CalendarDay.from(calendar); 
    list.add(calendarDay); 
} 

तो अब हम CalendarDay वस्तुओं की इस सूची मिल गया है, लेकिन हम काफी वहाँ नहीं कर रहे हैं। डेटा संरचना बनाने में अंतिम कदम यह है कि मैंने जो कुछ बताया है, उस पर 'कन्वर्ट' करना है, मैं ओपी - Collection<CalendarDay> संरचना में संघर्ष कर रहा था। एक बार जब हम यहां आते हैं तो यह आसान नहीं हो सकता है।सीधे शब्दों में इस तरह असाइन करें:

calendarDays = list; 

और फिर जब आप डेकोरेटर जोड़ना चाहते हैं, तो आप पूरी तरह तैयार हों। बस यह करें:

calendarView.addDecorators(new EventDecorator(myColor, calendarDays)); 

एक और बात भालू का उल्लेख करती है, और यह मेरे भ्रम का एक प्रमुख स्रोत था। मुझे समझ में नहीं आया कि इस Collection<CalendarDay> ऑब्जेक्ट को तुरंत कैसे चालू करें। वे (निर्माता से पहले) उदाहरण चर अनुभाग में, मैं इस कोड जोड़ा है, जो लगभग सभी के एंड्रॉयड स्टूडियो मेरे लिए भरे गए:

private Collection<CalendarDay> calendarDays = new Collection<CalendarDay>() { 
     @Override 
     public boolean add(CalendarDay object) { 
      return false; 
     } 

     @Override 
     public boolean addAll(Collection<? extends CalendarDay> collection) { 
      return false; 
     } 

     @Override 
     public void clear() { 

     } 

     @Override 
     public boolean contains(Object object) { 
      return false; 
     } 

     @Override 
     public boolean containsAll(Collection<?> collection) { 
      return false; 
     } 

     @Override 
     public boolean isEmpty() { 
      return false; 
     } 

     @NonNull 
     @Override 
     public Iterator<CalendarDay> iterator() { 
      return null; 
     } 

     @Override 
     public boolean remove(Object object) { 
      return false; 
     } 

     @Override 
     public boolean removeAll(Collection<?> collection) { 
      return false; 
     } 

     @Override 
     public boolean retainAll(Collection<?> collection) { 
      return false; 
     } 

     @Override 
     public int size() { 
      return 0; 
     } 

     @NonNull 
     @Override 
     public Object[] toArray() { 
      return new Object[0]; 
     } 

     @NonNull 
     @Override 
     public <T> T[] toArray(T[] array) { 
      return null; 
     } 
    }; 

मुझे आशा है कि यह किसी को मदद मिलती है। दोबारा, यदि कोई बेहतर समाधान है, तो कृपया पोस्ट करें और मैं अपना हटा दूंगा।

+0

ब्रो जब मैं करता हूं कि getYear() को हटा दिया गया है, तो मैं इसे बदलने के लिए क्या कर सकता हूं –

2

आपने हैशसेट के बजाय ArrayList का उपयोग क्यों किया? संग्रह को तुरंत चालू नहीं करने का कारण यह है क्योंकि यह एक इंटरफ़ेस है, इसलिए आपको अज्ञात वर्ग बनाना और विधियों को ओवरराइड करना था।

इस विधि दो कैलेंडर वस्तुओं में ले जाता है और CalendarDays की एक HashSet में दो कैलेंडर तिथियों के बीच में सभी दिन जोड़ता है:

यहाँ कैसे मैं ऐसी ही कुछ किया है।

private HashSet<CalendarDay> getCalendarDaysSet(Calendar cal1, Calendar cal2) { 
    HashSet<CalendarDay> setDays = new HashSet<>(); 
    while (cal1.getTime().before(cal2.getTime())) { 
     CalendarDay calDay = CalendarDay.from(cal1); 
     setDays.add(calDay); 
     cal1.add(Calendar.DATE, 1); 
    } 

    return setDays; 
} 
विधि onCreateView (...) पर

, मैं गतिशील दो कैलेंडर तिथियों, जो बीच का अंतर HashSet में संग्रहीत किया जाएगा निर्धारित किया है। हालांकि, आप हैशसेट में अपने स्वयं के यादृच्छिक सेट को पास कर सकते हैं।

Calendar cal1 = Calendar.getInstance(); 
    cal1.set(2016, 8, 1); 
    Calendar cal2 = Calendar.getInstance(); 
    cal2.set(2016, 9, 1); 

    HashSet<CalendarDay> setDays = getCalendarDaysSet(cal1, cal2); 
    int myColor = R.color.red; 
    mCalendarView.addDecorator(new BookingDecorator(myColor, setDays)); 

मेरे मामले में बुकिंग डिकोरेटर वह कक्षा है जो डेव्यूडेकोरेटर इंटरफेस लागू करता है।

private class BookingDecorator implements DayViewDecorator { 
    private int mColor; 
    private HashSet<CalendarDay> mCalendarDayCollection; 

    public BookingDecorator(int color, HashSet<CalendarDay> calendarDayCollection) { 
     mColor = color; 
     mCalendarDayCollection = calendarDayCollection; 
    } 

    @Override 
    public boolean shouldDecorate(CalendarDay day) { 
     return mCalendarDayCollection.contains(day); 
    } 

    @Override 
    public void decorate(DayViewFacade view) { 
     view.addSpan(new ForegroundColorSpan(mColor)); 
     //view.addSpan(new BackgroundColorSpan(Color.BLUE)); 
     view.setBackgroundDrawable(ContextCompat.getDrawable(getContext(),R.drawable.greenbox)); 

    } 
} 

आपकी पोस्ट बहुत उपयोगी थी। उम्मीद है कि मेरा भी किसी की मदद करता है। ,

MaterialCalendarView materialCalendar = (MaterialCalendarView)findViewById(R.id.materialCalenderView); 
materialCalendar.setSelectionColor(Color.parseColor("#00BCD4")); 

इस कोड का उपयोग एक ही रंग के सभी चयनकर्ताओं बनाता है, इसलिए यदि आप पर निर्भर करता है अलग रंग चयनकर्ताओं करना चाहते हैं -:

3

आप प्रोग्राम के चयनित की पृष्ठभूमि का रंग बदलना चाहते हैं, इस विधि का उपयोग आपकी हालत, सजावट का उपयोग करें()

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