gpt4 book ai didi

java - 如何更改 MaterialCalendarView 中日历日期的背景颜色

转载 作者:太空狗 更新时间:2023-10-29 13:10:51 29 4
gpt4 key购买 nike

我正在尝试使用收到的 JSON 响应更改日期的背景颜色。但是我遇到了一些困难。

这是我的代码:

<com.prolificinteractive.materialcalendarview.MaterialCalendarView
android:id="@+id/calendarView"
android:layout_width="match_parent"
android:layout_height="300dp"
android:layout_marginBottom="16dp"
android:layout_marginTop="16dp" />

MainActivty.java

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {     

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

calbg();
materialCalendarView.setDateTextAppearance(View.ACCESSIBILITY_LIVE_REGION_ASSERTIVE);
Calendar calendar = Calendar.getInstance();
materialCalendarView.setSelectedDate(calendar.getTime());
materialCalendarView.setOnDateChangedListener(new OnDateSelectedListener() {
get1 = sharedpreferences.getString(CLIENT, "");
materialCalendarView.setDateTextAppearance(getTitleColor());
materialCalendarView.setHeaderTextAppearance(R.style.AppTheme_Dark1);
}

private void calbg() {
// Volley's json array request object
StringRequest stringRequest = new StringRequest(Request.Method.POST, CALENDAR_DATA,
new Response.Listener < String > () {
@Override
public void onResponse(String response) {
JSONObject object = null;
try {
object = new JSONObject(response);
} catch (JSONException e) {
e.printStackTrace();
}

JSONArray jsonarray = null;
try {
jsonarray = object.getJSONArray("Table");
} catch (JSONException e) {
e.printStackTrace();
}

// SimpleDateFormatter formatter = new SimpleDateFormatter(); //TODO: update this line with the correct formatter
List<Event> events = new ArrayList<>();
for (int i = 0; i < jsonarray.length(); i++) {
try {
JSONObject obj = jsonarray.getJSONObject(i);

String str = obj.getString("eventdate").replaceAll("\\D+","");
String upToNCharacters = str.substring(0, Math.min(str.length(), 13));
DateFormat timeZoneFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
timeZoneFormat.setTimeZone(TimeZone.getTimeZone("GMT-8"));

Date time = new java.util.Date(Long.parseLong(upToNCharacters));
// System.out.println(time);
// movie.setDate(String.valueOf(timeZoneFormat.format(time)));
// String str2 = String.valueOf(timeZoneFormat.format(time));
String str1 = obj.optString("eventcolor");
// Date date = formatter.parse(str2);
int color = Integer.parseInt(str1); //TODO: update this line with the correct code to parse your color
Event event = new Event(time, color);
events.add(event);
}
catch (JSONException e) {
e.printStackTrace();
}
}

for (Event event : events) {

//Here is the problem in parameter
EventDecorator eventDecorator = new EventDecorator(event.getDate(), event.getColor());
materialCalendarView.addDecorator(eventDecorator);
}
}

}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// VolleyLog.d(TAG, "Error: " + error.getMessage());
// hidePDialog();

}
}) {
@Override
protected Map < String, String > getParams() {
Map < String, String > params = new HashMap < String, String > ();
params.put(CLIENT, get1);
return params;
}
};
// Adding request to request queue
MyApplication.getInstance().addToRequestQueue(stringRequest);
}}

JSON 响应

{  
"Table":[
{
"userid":4,
"eventname":"adi",
"eventdate":"\/Date(1484121600000-0800)\/",
"eventcolor":"2413AD",
"autoid":2005
},


{
"userid":4,
"eventname":"Mandeep",
"eventdate":"\/Date(1480924800000-0800)\/",
"eventcolor":"3A87AD",
"autoid":2002
},
{
"userid":4,
"eventname":"nefv",
"eventdate":"\/Date(1477465200000-0700)\/",
"eventcolor":"39AD37",
"autoid":2
},

]
}

enter image description here

最佳答案

第一步是创建一个 DayViewDecorator,它将一个 Date 和一个颜色作为参数:

public class EventDecorator implements DayViewDecorator {

private final Drawable drawable;
private final CalendarDay day;
private final int color;

public EventDecorator(MaterialCalendarView view, Date date, int color) {
this.day = CalendarDay.from(date);
this.color = color;
this.drawable = createTintedDrawable(view.getContext(), color);
}

@Override
public boolean shouldDecorate(CalendarDay day) {
if (this.day.equals(day)) {
return true;
}
return false;
}

@Override
public void decorate(DayViewFacade view) {
view.setSelectionDrawable(drawable);
}

private static Drawable createTintedDrawable(Context context, int color) {
return applyTint(createBaseDrawable(context), color);
}

private static Drawable applyTint(Drawable drawable, int color) {
Drawable wrappedDrawable = DrawableCompat.wrap(drawable);
DrawableCompat.setTint(wrappedDrawable, color);
return wrappedDrawable;
}

private static Drawable createBaseDrawable(Context context) {
return ContextCompat.getDrawable(context, R.drawable.day);
}
}

(注意,我使用了 this answer 中的代码来应用色调。此外,由于您没有指定,我假设可绘制对象是某种需要以这种方式着色的图像。)

下一步是创建一个 Event 类来存储您从 API 调用中解析的事件:

public class Event {

private Date date;
private int color;

public Event(Date date, int color) {
this.date = date;
this.color = color;
}

public Date getDate() {
return date;
}

public int getColor() {
return color;
}
}

现在我们需要向您的 onResponse() 方法添加逻辑以解析 JSON 并为每个事件添加装饰器。很难知道到底要写什么,因为您没有提供 JSON 示例。您之前的问题表明您已经知道如何解析 Date 所以我认为这就足够了。由于您尚未指定,我暂时将其保留。另外,我只是附加到您的代码 - 我不会尝试重构它太多。

@Override
public void onResponse(String response) {
JSONObject object = null;
try {
object = new JSONObject(response);
} catch (JSONException e) {
e.printStackTrace();
}

JSONArray jsonarray = null;
try {
jsonarray = object.getJSONArray("Table");
} catch (JSONException e) {
e.printStackTrace();
}

SimpleDateFormatter formatter = new SimpleDateFormatter(); //TODO: update this line with the correct formatter
List<Event> events = new ArrayList<>();
for (int i = 0; i < jsonarray.length(); i++) {
try {
JSONObject obj = jsonarray.getJSONObject(i);
String str2 = obj.optString("eventdate");
String str1 = obj.optString("eventcolor");
Date date = formatter.parse(str2);
int color = Integer.parseInt(str1); //TODO: update this line with the correct code to parse your color
Event event = new Event(date, color);
events.add(event);
}
catch (JSONException e) {
e.printStackTrace();
}
}

for (Event event : events) {
EventDecorator eventDecorator = new EventDecorator(calendarView, event.getDate(), event.getColor());
calendarView.addDecorator(eventDecorator);
}
}

关于java - 如何更改 MaterialCalendarView 中日历日期的背景颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41237073/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com