2013-08-30 15 views
27

Próbuję umieścić poziomy pasek postępu u góry mojej ramki. Ale wydaje się, że padding, którego po prostu nie mogłem usunąć. Jakaś pomoc?Wyrównaj ProgressBar poziomo do góry (usuń lukę)

enter image description here

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"> 
<ProgressBar android:id="@+id/flv_progress_bar" 
      android:layout_width="fill_parent" 
      style="@android:style/Widget.Holo.ProgressBar.Horizontal" 
      android:indeterminateOnly="true" 
      android:layout_height="wrap_content" 
      android:layout_gravity="top"/> 
</FrameLayout> 

Odpowiedz

32

Odpowiedź Pork'n'Bunny'a działała na poziomie interfejsu API 16 i więcej urządzeń. To rozwiązanie działało na wszystkich urządzeniach. Wystarczy przesunąć go o 6pp w formacie XML.

<ProgressBar 
     android:id="@+id/progressbar_Horizontal" 
     style="?android:attr/progressBarStyleHorizontal" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:max="100" 
     android:layout_alignParentTop="true" 
     android:layout_marginTop="-6dp" /> 
+16

Jaka byłaby to odporność na zmiany w domyślnych stylach? Czy mają gwarancję, że będą wyglądać i działać tak samo przez całą wieczność, czy teoretycznie mogliby zastąpić je w dowolnym momencie czymś, w którym naciskanie go o 6 pikseli mogłoby spowodować problemy (np. Niewidzialny pasek postępu)? – Joey

+6

To nie działa na każdym urządzeniu. W Galaxy S6, nawet z górnym marginesem "-6dp", biała przestrzeń nad paskiem postępu jest nadal widoczna. –

4

od spojrzeń tego, myślę, że spowodowany obrazem używanego w domyślnej stylizacji

style="@android:style/Widget.Holo.ProgressBar.Horizontal" 

(obraz mam na myśli to jest jeden: @android:drawable/progress_indeterminate_horizontal_holo i @android:drawable/progress_horizontal_holo_dark)

Te obrazy mają dużo tła na płótnie; dlatego też pokazuje tę lukę.

Moja rekomendacja:

użyć niestandardowego obrazu do stylu, który PregressBar. Takie, które nie ma dużego odstępu między płótnami.

enter image description here

+2

Jest to ostatecznie odpowiednia odpowiedź.Będę musiał edytować wersję wszystkich holo drawable (9 łatek), aby pozbyć się dopełnienia. –

-1

Myślę, że problem jest z atrybutu wysokości. spróbuj ustawić wysokość układu do pewnej wartości

<ProgressBar 
      android:id="@+id/progressBar" 
      android:max="100" 
      android:layout_width="match_parent" 
      android:layout_height="2dp" 
      style="@android:style/Widget.ProgressBar.Horizontal" 
      /> 
+0

To nie działa. –

+0

Jeśli tak jest, to powinieneś zmienić kanału alfa dostosowanych do nich w swoich stylach złożyć Raghuram

3

Kompletne rozwiązanie tego problemu będzie w następujący sposób. Na wszelki wypadek, jeśli ktoś potrzebuje fragmentów kodu, to właśnie zrobiłem.

  1. skopiowaniu wszystkich 8 nieokreślonych poziome kanału alfa Postępu
  2. edycji kanału alfa obrazu za pomocą jakiś manipulator i usuń niepotrzebne Uszczelki
  3. skopiował rozciągliwej XML o nazwie progress_indeterminate_horizontal_holo.xml z Android platformy
  4. skopiował styl widget. ProgressBar.Horizontal i jego rodzice
  5. Ustaw ręcznie styl i min_height w układzie

Oto progress_indeterminate_horizontal_holo.xml

<animation-list 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:oneshot="false"> 
<item android:drawable="@drawable/progressbar_indeterminate_holo1" android:duration="50" /> 
<item android:drawable="@drawable/progressbar_indeterminate_holo2" android:duration="50" /> 
<item android:drawable="@drawable/progressbar_indeterminate_holo3" android:duration="50" /> 
<item android:drawable="@drawable/progressbar_indeterminate_holo4" android:duration="50" /> 
<item android:drawable="@drawable/progressbar_indeterminate_holo5" android:duration="50" /> 
<item android:drawable="@drawable/progressbar_indeterminate_holo6" android:duration="50" /> 
<item android:drawable="@drawable/progressbar_indeterminate_holo7" android:duration="50" /> 
<item android:drawable="@drawable/progressbar_indeterminate_holo8" android:duration="50" /> 

zasobów Style skopiowane do mojego lokalnego pliku stylów.

<style name="Widget"> 
    <item name="android:textAppearance">@android:attr/textAppearance</item> 
</style> 

<style name="Widget.ProgressBar"> 
    <item name="android:indeterminateOnly">true</item> 
    <item name="android:indeterminateBehavior">repeat</item> 
    <item name="android:indeterminateDuration">3500</item> 
</style> 

<style name="Widget.ProgressBar.Horizontal"> 
    <item name="android:indeterminateOnly">false</item> 
    <item name="android:indeterminateDrawable">@drawable/progress_indeterminate_horizontal_holo</item> 
</style> 

Na koniec ustaw minimalną wysokość na 4dp w moim lokalnym pliku układu.

<ProgressBar 
    android:id="@+id/pb_loading" 
    style="@style/Widget.ProgressBar.Horizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_centerHorizontal="true" 
    android:layout_centerVertical="true" 
    android:indeterminate="true" 
    android:minHeight="4dp" 
    android:minWidth="48dp" 
    android:progressDrawable="@drawable/progress_indeterminate_horizontal_holo" /> 
+0

Dzięki Subin! Właściwie to jeszcze nie zrobiłem tego, ponieważ nie byłem pewien, ile czasu poza edycją jednego drawowania byłoby zrobić, teraz wszyscy wiemy. Dziękuję za udostępnienie. –

+0

Pytanie dotyczy '? Android: attr/progressBarStyleHorizontal', a nie' @ style/Widget.ProgressBar.Horizontal' –

1

Przyszło na inne rozwiązanie, ponieważ losowanie działa zgodnie z zamierzeniami na zrzucie ekranu. Wystarczy przesunąć go o 6 dp w górę.

mProgress = (ProgressBar) view.findViewById(R.id.fwv_progress); 
    mProgress.animate().withLayer().yBy(-6.0f*getResources().getDisplayMetrics().density).setDuration(0).start(); 
+0

Działa tylko na poziomie interfejsu API 16 i wyżej. Czy istnieje sposób naprawienia interfejsu API 8 i nowszych wersji? – bCliks