Android:直接在物料日历视图中更改年份

Android:直接在物料日历视图中更改年份,android,android-calendar,Android,Android Calendar,我正在使用 现在,单击向右或向左箭头可更改月份 如何直接更改年份而不是更改月份。 这是可能的android默认日历视图。 下面是我的多产互动日历代码 public class ActivityCalendar extends AppCompatActivity implements OnDateSelectedListener, OnMonthChangedListener { private static final DateFormat FORMATTER = SimpleDate

我正在使用

现在,单击向右或向左箭头可更改月份
如何直接更改年份而不是更改月份。
这是可能的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());
    }
}
公共类ActivityCalendar扩展AppCompative实现OnDateSelectedListener、OnMonthChangedListener{
私有静态最终日期格式格式化程序=SimpleDataFormat.getDateInstance();
私有MaterialCalendarView小部件;
私人字符串生肖=”;
私有HashMap hashMapMonth=新HashMap();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.layout\u日历);
小部件=(MaterialCalendarView)findViewById(R.id.calendarView);
setOnDateChangedListener(这个);
setOnMonthChangedListener(这个);
}
@凌驾
public void onDateSelected(@NonNull MaterialCalendarView小部件,@Nullable CalendarDay日期,已选择布尔值){
字符串strDate=getSelectedDatesString();
Intent returnIntent=新Intent();
returnIntent.putExtra(TagClass.BIRTH_DATE,strDate);
设置结果(Activity.RESULT_OK,returnIntent);
完成();
}
@凌驾
已更改的月公共无效(MaterialCalendarView小部件,日历日日期){
//无检测恒定条件
}
私有字符串getSelectedDatesString(){
CalendarDay日期=widget.getSelectedDate();
如果(日期==null){
返回“无选择”;
}
返回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>

现在的库似乎不可能做到这一点

为了做到这一点,您需要从github下载源代码,并将其作为库模块添加到您的项目中

然后,我希望至少在这些组件中需要进行更改:

  • ,以更改
    ViewPager.OnPageChangeListener中适配器的命名或用法
  • ,以提供年项目,而不是月项目

另外,我的印象是,进行这些更改也会导致库中出现重构。

目前,此库没有年份选择,但您可以像我一样进行操作,它将显示带有年份过滤器的日历

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

}
private fun getListOfYears():可变列表{
val cal=Calendar.getInstance()
cal.add(日历年,-10)
val tenYearBack=cal.get(日历年)
Log.i(“年表”、“十年回顾$十年回顾”)
val nCal=Calendar.getInstance()
nCal.add(日历年,10)
val tenYearAfter=nCal.get(日历年)
Log.i(“年表”、“十年之后$十年之后”)
val listOfYears=mutableListOf()
因为(我在十年前……十年后){
年份列表。添加(i)
}
年份表{
Log.i(“年表”、“年份列表$it”)
}
返回年份列表
}
2) 现在将一个微调器添加到布局中,并在微调器的arrayAdapter中传递如下列表:

 val yearAdapter = ArrayAdapter<Int>(context, R.layout.year_spinner_item, listOfYears)
val yearAdapter=ArrayAdapter(上下文,R.layout.year\u微调器\u项目,listOfYears)
3) 最后,在OnItemDeleted()方法中使用所选年份值(即2019)调用此方法(用户定义),以更改calendarView的年份。(注意:在下面的方法中,calendarView指的是calendarView小部件)

覆盖已选择(p0:AdapterView?,p1:View?,位置:Int,p3:Long){
selectedYear=listOfYears?获取(职位)
Utils.log(“所选年份为:$selectedYear”)
显示selectedYear日历(selectedYear)
}
私人娱乐节目selectedYear日历(selectedYear:Int?){
val cal=Calendar.getInstance()
校准设置(日历年,选择年份!!)
校准设置(日历月,0)
val maxCal=Calendar.getInstance()
maxCal.set(日历年,已选年份)
maxCal.set(日历月,11)
calendarView.state().edit()
.setMinimumDate(标定)
.setMaximumDate(maxCal)
.commit()
}

您找到问题的解决方案了吗?
 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()
}