// 由日期选择器派生出月份选择器
public class MonthPicker extends DatePicker {
public MonthPicker(Context context, AttributeSet attrs) {
super(context, attrs);
// 获取年月日的下拉列表项
ViewGroup vg = ((ViewGroup) ((ViewGroup) getChildAt(0)).getChildAt(0));
if (vg.getChildCount() == 3) { // 拥有三个下级视图
// 有的机型显示格式为“年月日”,此时隐藏第三个控件
vg.getChildAt(2).setVisibility(View.GONE);
} else if (vg.getChildCount() == 5) { // 拥有五个下级视图
// 有的机型显示格式为“年|月|日”,此时隐藏第四个和第五个控件(即“|日”)
vg.getChildAt(3).setVisibility(View.GONE);
vg.getChildAt(4).setVisibility(View.GONE);
}
}
}
======================================================================================
布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="5dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="请选择月份"
android:textColor="@color/black"
android:textSize="17sp" />
<!-- 自定义的月份选择器,需要使用全路径 -->
<com.example.myapplication.widget.MonthPicker
android:id="@+id/mp_month"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:calendarViewShown="false"
android:datePickerMode="spinner"
android:gravity="center" />
<Button
android:id="@+id/btn_ok"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="确 定"
android:textColor="@color/black"
android:textSize="17sp" />
<TextView
android:id="@+id/tv_month"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp"
android:textColor="@color/black"
android:textSize="17sp" />
</LinearLayout>
代码:
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import com.example.myapplication.widget.MonthPicker;
public class MainActivity extends AppCompatActivity implements View.OnClickListener
{
private TextView tv_month;
private MonthPicker mp_month; // 声明一个月份选择器对象
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_month = findViewById(R.id.tv_month);
// 从布局文件中获取名叫mp_month的月份选择器
mp_month = findViewById(R.id.mp_month);
findViewById(R.id.btn_ok).setOnClickListener(this);
}
@Override
public void onClick(View v)
{
if (v.getId() == R.id.btn_ok)
{
// 获取月份选择器mp_month设定的年月
String desc = String.format("您选择的月份是%d年%d月", mp_month.getYear(), mp_month.getMonth() + 1);
tv_month.setText(desc);
}
}
}
MonthPicker
package com.example.myapplication.widget;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.DatePicker;
// 由日期选择器派生出月份选择器
public class MonthPicker extends DatePicker
{
public MonthPicker(Context context, AttributeSet attrs)
{
super(context, attrs);
// 获取年月日的下拉列表项
ViewGroup vg = ((ViewGroup) ((ViewGroup) getChildAt(0)).getChildAt(0));
if (vg.getChildCount() == 3)
{
// 有的机型显示格式为“年月日”,此时隐藏第三个控件
vg.getChildAt(2).setVisibility(View.GONE);
}
else if (vg.getChildCount() == 5)
{
// 有的机型显示格式为“年|月|日”,此时隐藏第四个和第五个控件(即“|日”)
vg.getChildAt(3).setVisibility(View.GONE);
vg.getChildAt(4).setVisibility(View.GONE);
}
}
}