自定义控件——改造已有的控件——自定义月份选择器
// 由日期选择器派生出月份选择器 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); } } }