2011-07-01 15 views
7

Tôi đang cố gắng để chuyển đổi một SeekBar giữa hai chế độ để hiển thị trạng thái của phương tiện truyền trực tuyến.ProgressBar ngang: Toggling giữa xác định và không xác định

tôi đã thiết lập rằng đồ họa đúng hiển thị khi xác định thẻ android:indeterminate trong XML:

<SeekBar 
    android:id="@+id/seekBar1" 
    android:indeterminate="false" 
    android:progressDrawable="@android:drawable/progress_horizontal" 
    android:indeterminateDrawable="@android:drawable/progress_indeterminate_horizontal" 
    android:indeterminateBehavior="cycle" 
    android:indeterminateOnly="false" 
    android:progress="33" 
    android:secondaryProgress="66" 
    android:layout_height="wrap_content" 
    android:layout_width="match_parent"></SeekBar> 

example

Vấn đề là, khi cố gắng chuyển đổi bằng cách gọi setIndeterminate(true), các drawables không xuất hiện để thay đổi đúng cách. Trong trường hợp không xác định-> xác định, hoạt ảnh dừng lại, và từ xác định-> không xác định, không có gì xảy ra.

Tôi đang làm gì sai?

Trả lời

1

SeekBar onSizeChanged() chỉ khởi tạo nền đã chọn hiện tại có thể kéo và được gọi một lần khi SeekBar được khởi tạo. Vì vậy, một sửa chữa có thể là:

public class CorrectedSeekBar extends SeekBar { 

    public CorrectedSeekBar(Context context) { 
     super(context); 
    } 

    public CorrectedSeekBar(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public CorrectedSeekBar(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
     boolean current = isIndeterminate(); 
     setIndeterminate(!current); 
     super.onSizeChanged(w, h, oldw, oldh); 
     setIndeterminate(current); 
     super.onSizeChanged(w, h, oldw, oldh); 
    } 

} 

Và trong xml bố trí sử dụng <yourpackage.CorrectedSeekBar ...

doesnt này nhìn đẹp, cách giải quyết khác có thể tốt nhưng tôi nghĩ rằng đây là vấn đề chính (bug?).

0

Thay vào đó, hãy đặt pd thành không xác định chỉ cần chuyển đổi nền của nó. nếu bạn muốn các hoạt ảnh có thể vẽ được thì tôi khuyên bạn nên xem xét TransitionDrawable tại đây: TransitionDrawable. do đó, việc sử dụng nó là để thực sự thêm 2 drawables khác nhau và animate quá trình chuyển đổi của họ. tôi nghĩ rằng sẽ làm việc cho trường hợp của bạn. nhưng tôi không có kinh nghiệm làm một cái gì đó như thế này trên một hộp thoại tiến bộ vì vậy tôi không thể thực sự nói.

+0

Hi, cảm ơn bạn đã trả lời. Đó không phải là điều tôi sẽ làm; nó có vẻ như một hack lộn xộn. Thiết lập nền sẽ không hoạt động, vì nền là vùng màu đen trong hình trên. Thay thế trạng thái nhàn rỗi có thể vẽ của chính thanh đó bằng một chuyển tiếp có thể vẽ * có thể * hoạt động, nhưng sau đó tôi phải thiết lập các tiến trình chính và phụ đến 0, sau đó kích hoạt chuyển tiếp có thể vẽ được. Nó là không cần thiết phức tạp - nếu tôi phải làm điều đó, tôi cũng có thể chỉ cần sử dụng hai người tìm kiếm, và một viewflipper. –

+0

điều tôi muốn nói với nền thực sự là thay đổi kiểu dáng thanh tiến trình, có các bản vẽ tiến độ chính và phụ. bạn có thể chỉ cần thiết lập những thực tế trong thời gian chạy tùy thuộc vào những gì bạn cần, và cho việc chuyển tiếp drawable tôi nghĩ là một cách tốt hơn để đi hơn một viewflipper, và làm như vậy drawable tài nguyên sẽ yêu cầu không quá 10 dòng mã vì vậy tôi không nghĩ rằng điều đó thực sự phức tạp. nó dễ dàng hơn 2 thanh tiến trình và theo dõi chúng. – DArkO

+0

Vâng, chỉ cần thử nó và nó không hoạt động.Progressdrawable thực sự là một danh sách lớp, vì vậy khi nó được bao bọc trong một quá trình chuyển tiếp có thể vẽ được, các hình vẽ phụ có vẻ không được tiếp xúc với thanh tiến trình. Bạn kết thúc chỉ seing drawable mặc định. Đối với cùng một lý do, không thể xác định drawable không animate hoặc. –

2

Tôi đã gặp sự cố tương tự và tôi đã giải quyết vấn đề bằng cách gọi postInvalidate() để buộc làm mới chế độ xem. Tôi đang sử dụng Android 2.3.4.

// Configure the SeekBar 
seekBar.setIndeterminate(true); 
seekBar.postInvalidate(); 
0

Giải pháp này thực sự rất đơn giản, cùng một mẹo bạn phải sử dụng để bắt đầu một hoạt ảnh có thể vẽ được. Vấn đề này dường như chỉ ảnh hưởng đến Android 2.3 (có thể cũng là phiên bản cũ hơn của Android).

bất cứ khi nào bạn muốn thiết lập:

progressBar.setIndeterminate(true); 

này sử dụng một phần của mã thay vì:

this.progressBar.post(new Runnable() 
{ 
    @Override 
    public void run() 
    { 
     progressBar.setIndeterminate(true); 
    } 
});