2016-02-25 20 views
8

Tôi không biết tại sao nhưng tôi nhận được lỗi lạ này khi tôi sử dụng một nhà điều hành ternary trên ví dụ này:hành vi Strange sử dụng Java hành ternary trên Android

Screenshot of the strange behavior of setInterpolator

tôi nghĩ rằng nó có liên quan đến đường đi Java đúc kết quả từ toán tử nhưng nó chỉ xảy ra trong một số trường hợp cụ thể.

Cảm ơn bạn đã giải thích.

Lưu ý: Tôi đã tìm kiếm một tài khoản nhưng chỉ có thể tìm thấy câu trả lời có liên quan đến NPE.

-Edit-

Ứng dụng sử dụng:

  • compileSdkVersion 23
  • buildToolsVersion '23 .0.2'
  • minSdkVersion 14
  • targetSdkVersion 23
  • Thư viện hỗ trợ Android 23,2. 0

Thử nghiệm được thực hiện trên Android Studio 2.0 Beta 5 với phiên bản gradle tương ứng

+2

mà api mức đã bạn đặt cho ứng dụng của bạn? bởi vì 'LinearInterpolator' mở rộng' BaseInterpolator' mà [yêu cầu api cấp 22] (http://developer.android.com/reference/android/view/animation/BaseInterpolator.html) –

+0

Thay đổi minSdkVersion thành 22 ... – brso05

+0

nó defenetly muốn bạn thiết lập phiên bản api min đến 22. bởi vì public void setInterpolator (giá trị TimeInterpolator) nhưng bạn thiết lập linearinterpolator mở rộng nội suy cơ sở –

Trả lời

11

Lý do là do cách thức hoạt động của các toán tử ternary.

Luôn luôn đặt cả hai đối tượng là gần nhất Loại siêu phổ biến cho cả hai đối tượng. Trong trường hợp của bạn là BaseInterpolator, vì phiên bản targetSDK của bạn được đặt thành 23.

Nhưng, vì minSDK của bạn là 14, dàn diễn viên sẽ không hoạt động trên tất cả các thiết bị. Do đó lỗi.

Để khắc phục, bạn có thể thêm dàn diễn viên rõ ràng TimeInterpolator vào cả hai đối tượng.

0

tôi sửa lỗi này bằng mã sau:

public class MyDecelerateInterpolator implements Interpolator { 

    private DecelerateInterpolator interpolator = null; 

    public MyDecelerateInterpolator() { 
     interpolator = new DecelerateInterpolator(); 
    } 

    public MyDecelerateInterpolator(float factor) { 
     interpolator = new DecelerateInterpolator(factor); 
    } 

    @Override 
    public float getInterpolation(float input) { 
     return interpolator.getInterpolation(input); 
    } 
} 
+0

Thêm một số giải thích với câu trả lời cho cách câu trả lời này giúp OP trong việc sửa lỗi hiện tại –

+0

Tôi đọc mã DeccelerateInterpolator. Nó thực hiện BaseInterpolator và phù thủy thực hiện Interpolator. BaseInterpolator không thêm bất kỳ phương thức trừu tượng nào. Nó có nghĩa là hai lớp này có cùng phương thức trừu tượng có tên là getInterpolation (đầu vào float). Tôi không biết tại sao lỗi được hiển thị, nhưng miễn là phương pháp trừu tượng là như nhau, chúng ta có thể xác định một lớp phù thủy thực hiện Interpolator và kết thúc tốt đẹp DecelerateInterpolator. Do đó, không có lỗi nào khác. –

Các vấn đề liên quan