2012-05-01 39 views
13

Tôi đang sử dụng DatePicker cơ bản và tôi đang cố gắng tìm ra cách ẩn trường Năm trên DatePickerDialog để chỉ hiển thị tháng và ngày. Tôi không ngại rằng mã cơ bản của năm vẫn còn ở đó, tôi chỉ muốn che giấu Trường năm trong Hộp thoại. Bạn biết điều gì đó như:Ẩn trường Năm trong Android DatePicker?

((View) myYear).setVisibility(View.GONE); 

mà tôi biết không hoạt động vì myYear không phải là chế độ xem, nhưng có điều gì đó dọc theo những dòng đó. Có thể không?

+0

http://code.google.com/p/android-wheel/ thấy liên kết này. nó sẽ giúp bạn ... – MAC

Trả lời

22

Một cách siêu dễ dàng mà tôi tìm thấy để thực hiện một DatePicker là để gọi nó trong xml:

<DatePicker 
    android:id="@+id/thePicker" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"/> 

và sau đó che giấu bất cứ lĩnh vực bạn muốn (trong trường hợp này năm) trong java:

picker = (DatePicker) findViewById(R.id.thePicker); 
    try { 
     Field f[] = picker.getClass().getDeclaredFields(); 
     for (Field field : f) { 
      if (field.getName().equals("mYearPicker")) { 
       field.setAccessible(true); 
       Object yearPicker = new Object(); 
       yearPicker = field.get(picker); 
       ((View) yearPicker).setVisibility(View.GONE); 
      } 
     } 
    } 
    catch (SecurityException e) { 
     Log.d("ERROR", e.getMessage()); 
    } 
    catch (IllegalArgumentException e) { 
     Log.d("ERROR", e.getMessage()); 
    } 
    catch (IllegalAccessException e) { 
     Log.d("ERROR", e.getMessage()); 
    } 
+12

Bạn có thể thay thế 'if (field.getName(). Bằng (" mYearPicker ")) {' với 'if (field.getName(). Equals (" mYearPicker ") | | field.getName(). equals ("mYearSpinner")) {' để tính toán tiện ích DatePicker trong Honeycomb và các phiên bản Android cao hơn ... –

+2

cho Android mới nhất, cũng ẩn" mCalendarView " – YKS

8

Hãy thực sự cẩn thận với giải pháp này. bạn đang sử dụng phản xạ để truy cập một trường và thay đổi chế độ hiển thị. Điều này sẽ không hoạt động với Android 5.0! Google đã thay đổi việc triển khai TimePicker và DatePicker và các lớp không còn phơi bày bất kỳ trường nào appart từ đại biểu.

Tôi chưa biết giải pháp nào cho Android 5.0 +. Tôi sẽ cho bạn biết ngay sau khi tôi tìm thấy điều gì đó thú vị.

Như một ý tưởng, bạn có thể sử dụng Build.VERSION.SDK_INT để kiểm tra phiên bản Android và sau đó thử truy cập DatePickerSpinnerDelegate bằng cách sử dụng phản xạ và đặt trường bạn muốn.

Một lần nữa, đây không phải là giải pháp lý tưởng như Google có thể tự do thay đổi điều này một lần nữa và một lần nữa ...

+0

vì vậy giải pháp cho android là gì 5.0+? – RDD

+0

Tôi không bao giờ tìm thấy bất kỳ giải pháp tốt. Đối với dự án của chúng tôi, tôi chỉ đơn giản sử dụng DatePicker được cung cấp với lựa chọn năm ... Bạn cũng có thể xem https://android-arsenal.com/tag/27 này. Nó có thể hữu ích nếu bạn đang tìm kiếm một thư viện DatePicker có thể tùy chỉnh. – rontho

+1

tôi tạo ra một thành phần tùy chỉnh bằng cách làm theo [this] (http://stackoverflow.com/questions/21321789/android-datepicker-change-to-only-month-and-year) và có những gì tôi muốn. – RDD

1

Cách dễ dàng để vô hiệu hóa lĩnh vực năm trong bảng chọn ngày

DatePicker dp = findDatePicker((ViewGroup) dialog.getWindow().getDecorView()); 

if(dp != null) 
{ 
    ((ViewGroup) ((ViewGroup) dp.getChildAt(0)).getChildAt(0)).getChildAt(2).setEnabled(false); 
    ((ViewGroup) ((ViewGroup) dp.getChildAt(0)).getChildAt(0)).getChildAt(2).setAlpha(0.4f); 
} 

nếu bạn muốn loại bỏ lĩnh vực năm chỉ setvisibility của xem kết quả để View.GONE như dưới đây

dp.getChildAt(0)).getChildAt(0)).getChildAt(2).setVisibility(View.GONE) 



private DatePicker findDatePicker(ViewGroup group) { 
    if (group != null) { 
     for (int i = 0, j = group.getChildCount(); i < j; i++) { 
      View child = group.getChildAt(i); 
      if (child instanceof DatePicker) { 
       return (DatePicker) child; 
      } else if (child instanceof ViewGroup) { 
       DatePicker result = findDatePicker((ViewGroup) child); 
       if (result != null) 
        return result; 
      } 
     } 
    } 
    return null; 

} 

tôi đã refered bên dưới liên kết để tham khảo Remove year from DatePickerDialog

+0

sự cố trên Android 7 - Cố gắng gọi phương thức ảo 'void android.view.View.setVisibility (int)' trên tham chiếu đối tượng null –

1

Bạn có thể thiết lập phạm vi của năm bằng cách sử dụng chức năng này

datePicker.setYearRange(1950,2017); 
Các vấn đề liên quan