2011-02-15 11 views
7

Buduję interfejs użytkownika z kodu i mogę z powodzeniem dodawać widgety ProgressBar, jednak nie mogę zmienić wymiarów widgetu na wartości, których potrzebuję, zawsze pozostaje on w domyślnym rozmiarze (około 50 dp). Próbowałem następujący kod;Zmiana szerokości paska postępu dodanego w czasie wykonywania

ProgressBar progressBar = new ProgressBar(activity, null, android.R.attr.progressBarStyleHorizontal); 
    progressBar.setMinimumHeight(20); 
    progressBar.setMinimumWidth(100); 

Próbowałem zostały również ustawienie Progressbar LayoutParams ale znowu nic, a próbowałem owijania widget w innym układzie, ale nadal nie szczęścia.

Czy ktoś może pomóc, bo nie widzę, jak to zrobić? Jeśli istnieje rozwiązanie wykorzystujące XML, może to działać, ale muszę ustawić wymiar i lokalizację w czasie wykonywania.


Dla pliku XML postępu użyłem następujących elementów.

<ProgressBar 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="10dp" 
     android:indeterminateOnly="false" 
     android:progressDrawable="@android:drawable/progress_horizontal" 
     android:indeterminateDrawable="@android:drawable/progress_indeterminate_horizontal" 
     android:maxWidth="1000dp" 
    /> 

Następnie kod do nadmuchania jest następujący. To mieszanka tego, o czym dyskutowaliśmy.

LayoutInflater layoutInflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    ProgressBar progressBar = (ProgressBar)layoutInflater.inflate(R.layout.progress_bar, null); 
    progressBar.setMinimumHeight(10); 
    progressBar.setMinimumWidth(200); 
    progressBar.setLayoutParams(new RelativeLayout.LayoutParams(200, 10); 

    progressBar.setMax(100); 
    progressBar.setProgress(getScrollBarValue()); 
    progressBar.setIndeterminate(isIndeterminate()); 
    progressBar.getLayoutParams().width = 200; 
    progressBar.invalidate(); 
+0

Myślę, że rozwiązaniem byłoby skopiowanie kodu źródłowego widgetu i wdrożenie brakujących metod. Wydaje się szalone rozwiązanie, musi być sposób, aby to zrobić. – Snowwire

+0

Aby potwierdzić: szukasz stylów paska, a nie stylu spinnera? Prawdopodobnie wystarczyłoby dowiedzieć się, gdzie zdefiniowano style/kształty, a także skopiować i dostosować je. – sstn

Odpowiedz

9

R.layout.activity Obejmuje to:

<ProgressBar 
     android:id="@+id/progress" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:indeterminate="true" 
     android:visibility="visible" 
     style="@android:style/Widget.ProgressBar.Large.Inverse" 
/> 

A potem Kod:

public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity); 
    ProgressBar bar = (ProgressBar)findViewById(R.id.progress); 
    bar.getLayoutParams().height = 500; 
    bar.invalidate(); 
} 

Wywołanie metody invalidate() jest ważne, jak to jest, gdy widok jest przerysowywany w celu uwzględnienia zmian. Mimo że jest nieintuicyjny, umożliwia lepszą wydajność poprzez grupowanie zmian.

+0

Próbowałem metody, którą zasugerowałeś, ale nie miało to żadnego wpływu na rozmiar. – Snowwire

+0

Podaję dwie metody, których potrzebujesz, dzwonienie po jednym nie zadziała. Właśnie zbudowałem testową aktywność za pomocą tego kodu z ProgressBar i działa dobrze. Sugeruję więc, abyś upewnił się, że: a) napisany przez ciebie kod jest wykonywany, oraz b) że kod dostosowuje rozmiar do prawego paska postępu. Zaktualizowałem swoją odpowiedź, aby uwzględnić kod. –

+0

Nie miałem jeszcze okazji wypróbować Twojego kodu, ale układy definiuję całkowicie w kodzie. Tak więc tworzę RelativeLayout, następnie dodam widok podrzędny, który jest ProgressBar. Następnie setContentView służy do dodania RelativeLayout. Nie ma layout.xml – Snowwire

0

Istnieją również parametry MinWidth/minHeight/maxWidth/maxHeight, ale (jak sądzę) można je ustawić tylko za pomocą XML lub poprzez styl/motyw.

W przeciwnym razie można zawyżać widok programu ProgressBar z pliku XML.

+0

Próbowałem tego, co zasugerowałeś, i mogłem uzyskać wysokość widgetu do zmiany, ale nie szerokość. Z tego, co mogłem powiedzieć, właściwości max i min szerokość muszą być takie same, aby rozmiar zaczął obowiązywać. Właściwość max size nie może być zmieniona w czasie wykonywania, nie jest odsłonięta. – Snowwire

+0

Jakim kierunkiem jest Twój ProgressBar? Rozmiar w kierunku paska postępu powinien być zwykle określany przez układ. – sstn

+0

To nie jest prawda, możesz ustawić parametry w kodzie, używając LayoutParams –

0

Tak, trzeba określić swój własny styl na pasku postępu:

<style name="SmallProgressBar" parent="android:Widget.ProgressBar"> 
    <item name="android:minHeight">10dip</item> 
    <item name="android:maxHeight">35dip</item> 
</style> 

Tutaj można ustawić minimalną i maksymalną wysokość i szerokość paska postępu oraz innych ciekawych funkcji.

Teraz można ustawić w stylu układu xml:

<ProgressBar 
    android:id="@+id/custom_edit_text_progress_bar" 
    style="@style/SmallProgressBar" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentEnd="true" 
    android:layout_alignParentTop="true" 
    android:visibility="visible"/> 

Po nadmuchać swój pasek postępu, to

getLayoutParams().height = 25 

i

getLayoutParams().width = 25 

na pasku postępu i ustawić wysokość i szerokość.

UWAGA: Nie można przekraczać wysokości i szerokości zdefiniowanych w stylach.

Powiązane problemy