java - सामग्री-कैलेंडरदृश्य तारों का पृष्ठभूमि रंग सेट करें




android calendar (4)

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

मैंने उल्लेख किया है कि मेरी तिथियों की सूची के साथ एक सरणी है मुझे उस ऐरे से दोबारा करने की आवश्यकता है, प्रत्येक 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> - एक Collection<CalendarDay> संरचना में संघर्ष कर रहा हूं। एक बार हम यहां पहुंचने के बाद यह कोई आसान नहीं हो सकता है। बस इसे इस तरह असाइन करें:

calendarDays = list;

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

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

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

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

मुझे उम्मीद है कि यह किसी को मदद करता है दोबारा, अगर एक बेहतर समाधान है, तो पोस्ट करें और मैं मेरा हटा दूँगा।

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

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

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

<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 को परिवर्तित करने के लिए ArrayList<Date> markedDates करता है कि वे क्या Collection<CalendarDay> dates कॉल करता है Collection<CalendarDay> dates इस बात से सहमत? लेकिन यह वह जगह है जहां मैं सचमुच नीचे फट गया हूं। यह डेटा संरचना मेरे लिए विचित्र है जब मैं इसे new CalendarDay() कैलेंडरडे पर कॉल करके इन्स्तांत करने की कोशिश करता हूं new CalendarDay() मेरी कक्षा में लगभग 10 नए तरीकों का विस्तार होता है, जिन्हें मैं उनकी भूमिका या उनके साथ क्या करना नहीं समझता जाहिर है, मैं यहाँ रेल जा रहा हूँ यह सिर्फ यह मुश्किल नहीं हो सकता।

क्या किसी ने इस प्रयोजन के लिए इस पुस्तकालय का इस्तेमाल किया है और यह काम कैसे पूरा किया है? मैं एक पीस रोक में हूँ इसके अलावा, यदि कोई सरल लाइब्रेरी है, तो मुझे रन-टाइम पर जाने वाले रंग का उपयोग करके पृष्ठभूमि रंग सेट करने की अनुमति देने के लिए, मैं सभी कान हूं

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


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

यहां मैंने ऐसा कुछ किया है:

इस पद्धति को दो कैलेंडर ऑब्जेक्ट में ले जाता है और दिन कैलेंडर डे के हाशसेट में दो कैलेंडर तिथियों के बीच सभी दिन जोड़ता है।

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

मेरे मामले में BookingDecorator वर्ग है जो DayViewDecorator इंटरफ़ेस लागू करता है।

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

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


boolean alltrue = true;
for(int i = 0; alltrue && i<booleanArray.length(); i++)
   alltrue &= booleanArray[i];

मुझे लगता है कि यह ठीक दिखता है और अच्छी तरह से व्यवहार करता है ...





java android calendar