自定义控件——改造已有的控件——自定义月份选择器

 

 

 

 

 

// 由日期选择器派生出月份选择器
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);
        }
    }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2022-09-03 15:04  小白龙白龙马  阅读(56)  评论(0编辑  收藏  举报