我正在使用https://github.com/prolificinteractive/material-calendarview
现在它正在改变点击右箭头或左箭头的月份 如何直接更改年份而不是更改月份 这是可能的Android默认日历视图。 下面是我的多产交互代码 - 日历
public class ActivityCalendar extends AppCompatActivity implements OnDateSelectedListener, OnMonthChangedListener {
private static final DateFormat FORMATTER = SimpleDateFormat.getDateInstance();
private MaterialCalendarView widget;
private String zodiacSign = "";
private HashMap<String,Integer> hashMapMonth = new HashMap<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_calendar);
widget = (MaterialCalendarView)findViewById(R.id.calendarView);
widget.setOnDateChangedListener(this);
widget.setOnMonthChangedListener(this);
}
@Override
public void onDateSelected(@NonNull MaterialCalendarView widget, @Nullable CalendarDay date, boolean selected) {
String strDate = getSelectedDatesString();
Intent returnIntent = new Intent();
returnIntent.putExtra(TagClass.BIRTH_DATE, strDate);
setResult(Activity.RESULT_OK, returnIntent);
finish();
}
@Override
public void onMonthChanged(MaterialCalendarView widget, CalendarDay date) {
//noinspection ConstantConditions
}
private String getSelectedDatesString() {
CalendarDay date = widget.getSelectedDate();
if (date == null) {
return "No Selection";
}
return FORMATTER.format(date.getDate());
}
}
Layout.XML
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ActivityCalendar">
<com.prolificinteractive.materialcalendarview.MaterialCalendarView
android:id="@+id/calendarView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
答案 0 :(得分:3)
现在这个库现在看起来似乎不可能。
为了做到这一点,您需要从github下载源代码,并将其作为库模块添加到项目中。
然后,我希望至少需要对这些组件进行更改:
ViewPager.OnPageChangeListener
另外,我的印象是,进行这些更改也会导致库中的市长重构。
答案 1 :(得分:0)
到目前为止,该库没有年份选择,但是您可以像我一样进行操作,并且它将显示带有年份过滤器的日历。
1)准备一些年份列表,您可以使用下面的方法,它将给您20年的列表,过去10年和未来10年。
private fun getListOfYears(): MutableList<Int> {
val cal = Calendar.getInstance()
cal.add(Calendar.YEAR, -10)
val tenYearBack = cal.get(Calendar.YEAR)
Log.i("yearList", "tenYearBack $tenYearBack")
val nCal = Calendar.getInstance()
nCal.add(Calendar.YEAR, 10)
val tenYearAfter = nCal.get(Calendar.YEAR)
Log.i("yearList", "tenYearAfter $tenYearAfter")
val listOfYears = mutableListOf<Int>()
for (i in tenYearBack..tenYearAfter) {
listOfYears.add(i)
}
listOfYears.forEach {
Log.i("yearList", "listOfYears $it")
}
return listOfYears
}
2)现在,将一个微调器添加到您的布局中,并在微调器的arrayAdapter中传递此列表,如下所示:
val yearAdapter = ArrayAdapter<Int>(context, R.layout.year_spinner_item, listOfYears)
3)最后,使用onItemSeleted()方法中选定的年份值(即2019)调用此方法(用户定义),以更改calendarView的年份。 (注意:在下面的方法中,calendarView指的是CalendarView小部件。)
override fun onItemSelected(p0: AdapterView<*>?, p1: View?, position: Int, p3: Long) {
selectedYear=listOfYears?.get(position)
Utils.log("Selected Year is: $selectedYear")
showSelectedYearCalendar(selectedYear)
}
private fun showSelectedYearCalendar(selectedYear: Int?) {
val cal=Calendar.getInstance()
cal.set(Calendar.YEAR,selectedYear!!)
cal.set(Calendar.MONTH,0)
val maxCal=Calendar.getInstance()
maxCal.set(Calendar.YEAR,selectedYear)
maxCal.set(Calendar.MONTH,11)
calendarView.state().edit()
.setMinimumDate(cal)
.setMaximumDate(maxCal)
.commit()
}