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()
}