Я не мог найти, как создать такой встроенный календарь, используя CalendarView
, поэтому я придумал свою собственную реализацию:
------- inline_calendar.xml -------
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
<Button
android:id="@+id/calendar_prev_button"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginEnd="40dp"
android:layout_marginRight="40dp"
android:background="@drawable/ic_baseline_chevron_left_24px" />
<TextView
android:id="@+id/display_date"
android:layout_width="wrap_content"
android:layout_height="80dp"
android:gravity="center"
android:text="Feb 2019"
android:textAppearance="@android:style/TextAppearance.Large"
android:textColor="#222222"
android:textSize="30sp"
android:textStyle="bold" />
<Button
android:id="@+id/calendar_next_button"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginStart="40dp"
android:layout_marginLeft="40dp"
android:background="@drawable/ic_baseline_chevron_right_24px" />
</LinearLayout>
------- InlineCalendar.java -------
public class InlineCalendar extends LinearLayout {
private Button btnPrev;
private Button btnNext;
private TextView tvDate;
private Calendar calendar = Calendar.getInstance();
private MyOnClickListener myOnClickListener;
private static final String TAG = "InlineCalendar";
public InlineCalendar(Context context, AttributeSet attrs) {
super(context, attrs);
initControl(context);
initInterface();
}
public void setListener(MyOnClickListener myOnClickListener) {
this.myOnClickListener = myOnClickListener;
}
public Calendar getCalendar() {
return calendar;
}
private void assignUiElements() {
// layout is inflated, assign local variables to components
btnPrev = findViewById(R.id.calendar_prev_button);
btnNext = findViewById(R.id.calendar_next_button);
tvDate = findViewById(R.id.display_date);
}
private void initInterface() {
myOnClickListener = new MyOnClickListener() {
@Override
public void onClickListener() {
}
};
}
private void assignClickHandlers() {
assignOnClickListener(btnPrev, -1);
assignOnClickListener(btnNext, 1);
btnNext.setVisibility(View.INVISIBLE);
}
private void assignOnClickListener(final Button btn, final int addMonth) {
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
updateCalendar(addMonth);
myOnClickListener.onClickListener();
boolean condition = (Calendar.getInstance().get(Calendar.MONTH) == calendar.get(Calendar.MONTH) &&
Calendar.getInstance().get(Calendar.YEAR) == calendar.get(Calendar.YEAR));
btnNext.setVisibility(condition ? View.INVISIBLE : View.VISIBLE);
}
});
}
private void initControl(Context context) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.inline_calendar, this);
assignUiElements();
assignClickHandlers();
updateCalendar(0);
}
public void updateCalendar(int addMonth) {
calendar.add(Calendar.MONTH, addMonth);
tvDate.setText(calendarToString());
}
private String calendarToString() {
SimpleDateFormat date_format = new SimpleDateFormat("MMM yyyy", Locale.ENGLISH);
return date_format.format(calendar.getTime());
}
public interface MyOnClickListener {
void onClickListener();
}
}
Чтобы использовать InlineCalendar
, достаточно включить в свой код Activity's XML
следующий код:
<com.example.Activity.InlineCalendar
android:id="@+id/inlineCalendar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
Кроме того, вы можете назначить пользовательский слушатель предыдущей и следующей кнопке, используя метод setListener(MyOnClickListener myOnClickListener)
, как в CalendarView