2015-10-26 2 views
4

Есть ли способ подключения более чем одного DotSpan к дате с Android MaterialCalendarView? Altough У меня есть 2 DotSpan добавил к моему CalendarView это все еще отображается только 1 DotSpan ... Я использую следующий код:Использование нескольких DotSpan в MaterialCalendarView

@Override 
public boolean shouldDecorate(CalendarDay day) { 
    day.copyTo(calendar); 
    for (int i = 0; i < weekDayStrTmp.size(); i++) { 
     if (weekDayStrTmp.contains(day)) { 
      return true; 
     } else { 
      return false; 
     } 
    } 
    return false; 
} 

@Override 
public void decorate(DayViewFacade view) { 
    view.addSpan(new DotSpan(8, myContext.getResources().getColor(R.color.myColor3))); 
    view.addSpan(new DotSpan(8, myContext.getResources().getColor(R.color.myColor3))); 
} 

ответ

7

переопределение первого DotSpan со вторым. Данный класс DotSpan позволяет создавать центрированную цветную точку под текстом, поэтому, если вы ставите один поверх другого, первый не будет виден.

мне удалось создать несколько DotSpans на ту же точку зрения DayViewFacade, я не уверен, что это точное решение, которое вы искали, но я уверен, что это будет полезно:

Таким образом, вы должны создайте собственный класс Decorator, который реализует DayViewDecorator, назовем его OrangeDecorator.

Вам необходимо создать другой пользовательский класс, который реализует LineBackgroundSpan, и мы назовем его MyCustomOrangeSpan.

Оба класса почти такие же, как оригинальные DotSpan и EventDecorator, взятые из исходной библиотеки, но вы можете настроить классы для своих нужд.

В функции «украшают» (OrangeDecorator класс) использовать пользовательский LineBackgroundSpan так:

@Override 
public void decorate(DayViewFacade view) { 
    view.addSpan(new MyCustomOrangeSpan(6, ContextCompat.getColor(mContext, R.color.AppOrange))); 
} 

В «drawBackground» функции (класс MyCustomOrangeSpan), вы будете иметь возможность расположить круг внутри холста , так что давайте сделаем это:

@Override 
    public void drawBackground(Canvas canvas, Paint paint, int left, int right, int top, int baseline, 
           int bottom, CharSequence text, int start, int end, int lnum) { 

     int oldColor = paint.getColor(); 
     if (color != 0) { 
      paint.setColor(color); 
     } 

     canvas.drawCircle((left + right)/2 - 20, bottom + radius, radius, paint); 
     paint.setColor(oldColor); 

    } 

таким образом, мы можем создать несколько DayViewDecorators и LineBackgroundSpan (для различного позиционирования):

BlueDecorator blueDecorator = new BlueDecorator(getActivity(),eventsDays,eventsMap); 
OrangeDecorator orangeDecorator = new OrangeDecorator(getActivity(),eventsDays,eventsMap); 
GreenDecorator greenDecorator = new GreenDecorator(getActivity(),eventsDays,eventsMap); 
materialCalendarView.addDecorator(blueDecorator); 
materialCalendarView.addDecorator(orangeDecorator); 
materialCalendarView.addDecorator(greenDecorator); 
+0

Большое спасибо за помощь! Это очень помогло! Очень хорошее объяснение и хороший код. – user754730

+0

У вас есть идеи, почему эта строка: view.addSpan (новый MyCustomOrangeSpan (6, ContextCompat.getColor (mContext, R.color.AppOrange))); показывает ошибку sayign «MyCustomOrangeSpan() в MyCustomOrangeSpan не может применяться к (int int)? –

+0

Убедитесь, что конструктор вашего MyCustomOrangeSpan получает эти 2 ints ... – Juvi