2012-02-27 25 views
40

Trên màn hình cài đặt của tôi, tôi có một tiện ích bộ chọn ngày. Trong nhà thiết kế trong Eclipse, nó cho thấy như tôi muốn (3 spinners cho D-M-Y) nhưng khi tôi thử nghiệm trên thiết bị của mình, tôi có một cái nhìn khá kỳ lạ với một spinner bên trái và một lịch ở bên phải. Không bao giờ nhìn thấy điều này trước khi (!) Nhưng làm một số nghiên cứu tôi nghĩ rằng tôi đang nhìn thấy "CalendarView".Làm thế nào để tắt CalendarView trong một DatePicker?

Tôi thấy rằng tôi có thể đặt thuộc tính "calendarViewShown" thành false- nhưng XML của tôi ném lỗi với điều này. Tôi tìm thấy một câu hỏi khác ở đây cho rằng mức API là để đổ lỗi (minSDKLevel của tôi là 7, nhưng tôi đang nhắm mục tiêu 11 vì vậy tôi có thể nhận được nút thanh tác vụ thay vì menu oldskool). Vì vậy, tôi nghĩ rằng tôi muốn thử thiết lập nó trong mã:

int currentapiVersion = android.os.Build.VERSION.SDK_INT; 
    if (currentapiVersion >= 11) 
     minDateSelector.setCalendarViewShown = false; 

Nhưng một lần nữa, setCalendarViewShown fails- này không được tìm thấy. Nhưng tài liệu here nói rằng tài liệu phải tồn tại. Bất kỳ ý tưởng nào ?!

+0

thêm @SuppressLint ("NewApi") trong nhật thực để ngăn chặn các cảnh báo và làm những gì SoloCrowd đề nghị. – tobias

+0

minDateSelector là gì? – Jilberta

Trả lời

5

Tôi gặp vấn đề tương tự như bạn, tôi không thể thực hiện thay đổi xuất hiện qua XML.

Bạn đang đi đúng hướng, hãy thử thay đổi dòng cuối cùng của bạn để:

minDateSelector.setCalendarViewShown(false); 
+1

Cảm ơn - Tôi đã thay đổi sang một tùy chọn giao diện người dùng khác ngay bây giờ, nhưng tôi có thể truy cập lại datepicker thay vào đó, âm thanh như trên sẽ hoạt động! – James

32

Phương pháp này trong DatePicker

public void setCalendarViewShown (boolean shown) 

tồn tại bắt đầu với API 11. Nếu bạn minSdkLevel = 7 trình biên dịch không không nhận ra đây là phương thức hợp lệ - phương thức không tồn tại trên Android 2.3 hoặc 2.2. Cách tốt nhất là giải quyết điều này là sử dụng sự phản chiếu. Một cái gì đó như thế này nên làm việc đúng cách:

int currentapiVersion = android.os.Build.VERSION.SDK_INT; 
if (currentapiVersion >= 11) { 
    try { 
    Method m = minDateSelector.getClass().getMethod("setCalendarViewShown", boolean.class); 
    m.invoke(minDateSelector, false); 
    } 
    catch (Exception e) {} // eat exception in our case 
} 
+3

Bạn nên luôn nhắm mục tiêu SDK mới nhất; điều này là tránh cần phải sử dụng sự phản chiếu. –

+0

hoàn toàn tốt cho tôi. cảm ơn! nếu người dùng đang sử dụng <11 anh ấy không phải là đối tượng mục tiêu của tôi. ít nhất tôi đã cứu anh ta/cô ấy từ một vụ tai nạn ngay bây giờ;) – datayeah

10

Trong những trường hợp tôi sử dụng

import android.os.Build; 

@TargetApi(Build.VERSION_CODES.HONEYCOMB) 
public void someThing() { 
    [...] 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
     minDateSelector.setCalendarViewShown(false); 
    } 
} 

Tôi nghĩ rằng khả năng đọc tốt hơn là sử dụng phản chiếu và phong cách là tốt hơn so với đánh bắt và bỏ qua ngoại lệ. Tất nhiên điều phản xạ cũng đang hoạt động.

+0

minDateSelector là gì? – Jilberta

+0

@Jilberta Đây là một ví dụ về ['DatePicker'] (http://developer.android.com/reference/android/widget/DatePicker.html). –

92

Nếu bạn đang nhắm mục tiêu một phiên bản mới hơn của API, bạn có thể sử dụng XML sau (không cần phải viết mã Java) trong <DatePicker> của bạn:

android:calendarViewShown="false" 
+0

https://developer.android.com/reference/android/widget/DatePicker.html#attr_android:calendarXemShown - theo tài liệu này, nó chỉ áp dụng cho chế độ "xoay tròn". – ihayet

+0

Ok, vậy làm thế nào để bạn làm điều đó nếu bạn muốn * để viết mã Java? – Michael

+0

@Michael bạn có thể sử dụng 'setCalendarViewShown (boolean shown)' nếu bạn muốn viết mã Java –

10

tôi đã làm cho nó làm việc với các cấu hình XML sau đây:

android:datePickerMode="spinner" 
android:calendarViewShown="false" 

Chỉ có cấu hình sau đây không làm việc cho tôi:

android:calendarViewShown="false" 
Các vấn đề liên quan