Usuń pionowe dopełnienie z poziomego paska ProgressBar

127

Domyślnie ProgressBar ma pewne dopełnienie powyżej i poniżej samego paska. Czy jest sposób na usunięcie tej wyściółki, aby na końcu pozostała tylko sztanga?

abergmeier
źródło
7
Jak zauważono w innych tematach, ustawienie maxHeightnie działa.
abergmeier,
android:minHeight="4dp"
Sam Chen

Odpowiedzi:

72

Używam następującego rozwiązania jako obejścia tego problemu.

android:layout_marginBottom="-8dp"
android:layout_marginTop="-4dp"
Stephen Wan
źródło
1
Nie potrzebowałem layout_marginBottom.
AlikElzin-kilaka,
11
android:layout_marginTop="-6dp"pracował dla mnie. Zastanawiasz się, czy to zależy od urządzenia? Testowałem tylko na Xperii Z1
Thorbjørn Kappel Hansen
2
@ ThorbjørnKappelHansen To zależy od urządzenia. Galaxy S6 i górny margines -6dp nie działa zgodnie z oczekiwaniami.
Muhammad Abdul-Rahim
1
Myślę, że marginesy zależałyby od rozmiaru paska postępu i wersji Androida.
Noel
2
używanie Framelayout(jak w tej odpowiedzi jest lepszym rozwiązaniem i nie zależy od rozmiaru telefonu / typu / wersji systemu
operacyjnego
57

Oto jak wykorzystałem odpowiedź Juozasa:

wysokość mojego ProgressBarto 4dp. Utworzyłem więc a FrameLayouto wysokości 4dp i ustawiłem layout_gravityof ProgressBarna center. Działa jak urok.

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="4dp">

    <ProgressBar
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="4dp"
        android:layout_gravity="center"
        android:indeterminate="true"/>

</FrameLayout>
penduDev
źródło
23
To dobry pomysł, ale Twój kod nie działał dla mnie na Androidzie 7.0 przy użyciu paska postępu biblioteki pomocy technicznej. Kierownica stała się cieńsza, ale nadal miała wyściółkę na górze.
Sam
4
@Sam Po prostu utwórz pasek postępu, np. Wysokość = 100 dp. Ze względu na FrameLayout nadal pozostaje 4dp, ale pasek wygląda na grubszy.
Megaetron
5
Nie działa na API 24+. Pasek staje się cieńszy bez względu na rozmiar, jaki na nim ustawimy.
Mauker
36

Skończyło się na użyciu biblioteki niestandardowej, aby rozwiązać ten problem. Większość innych rozwiązań działa, ale wyniki nie są spójne na różnych urządzeniach.

MaterialProgressBar

  • Spójny wygląd na Androidzie 4.0+.
  • Prawidłowe zabarwienie na różnych platformach.
  • Potrafi usunąć wewnętrzne wypełnienie Framework ProgressBar.
  • W stanie ukryć ścieżkę poziomego ProgressBar ramy.
  • Używany jako zamiennik programu Framework ProgressBar.

Aby dodać jako zależność gradle:

compile 'me.zhanghai.android.materialprogressbar:library:1.1.7'

Aby dodać ProgressBar bez wewnętrznego dopełnienia do układu:

<me.zhanghai.android.materialprogressbar.MaterialProgressBar
    android:layout_width="wrap_content"
    android:layout_height="4dp"
    android:indeterminate="true"
    app:mpb_progressStyle="horizontal"
    app:mpb_useIntrinsicPadding="false"
    style="@style/Widget.MaterialProgressBar.ProgressBar.Horizontal" />

app:mpb_useIntrinsicPadding="false"Zrób sztuczkę. Aby uzyskać więcej informacji, zobacz stronę GitHub .

Binoy Babu
źródło
Najpierw próbowałem uniknąć dodania kolejnej zależności tylko po to, aby usunąć trochę wypełnienia. Ale wszystkie inne rozwiązania zawiodły w taki lub inny sposób / wersja i ostatecznie zajęło to 3 minuty! Dziękuję Ci.
ToniTornado,
32
Cała biblioteka tylko po to, aby naprawić wypełnienie w widoku. Dobra droga do Google.
Denny
Możesz użyć @ style / Widget.AppCompat.ProgressBar.Horizontal dla powyższego (w zależności od konfiguracji)
ror
32

Jeśli ktoś nadal potrzebuje pomocy, może spróbować:

<androidx.core.widget.ContentLoadingProgressBar
    android:id="@+id/progress"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    style="@style/Widget.AppCompat.ProgressBar.Horizontal"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintTop_toTopOf="@+id/guideline"
    android:indeterminate="true"
    android:visibility="visible"
    app:layout_constraintBottom_toTopOf="@+id/guideline" />

Tutaj pasek postępu znajduje się wewnątrz ConstraintLayout , a atrybuty constraintTop_toTopOf i constraintBottom_toTopOf muszą zostać zastosowane do tego samego elementu (w tym przypadku jest to wytyczna).

*** KOMPLETNE ROZWIĄZANIE: ***

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="48dp">

<View
    android:id="@+id/guideline"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:orientation="vertical"
    android:visibility="invisible"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent" />

<ProgressBar
    android:id="@+id/progress_bar"
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:indeterminate="true"
    app:layout_constraintBottom_toTopOf="@+id/guideline"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="@+id/guideline" />
</androidx.constraintlayout.widget.ConstraintLayout>
Ali_Waris
źródło
5
Powinno to być oznaczone jako poprawna odpowiedź, ponieważ działa idealnie!
Philio,
1
To jest właściwa odpowiedź! Jesteś kompatybilny ze wszystkimi urządzeniami (które nie mają ujemnego marginesu) i wersjami Androida (które nie są dostarczane przez rozwiązanie układu ramek). Nie musisz też wykonywać całej tej pracy, która była potrzebna, poprzez importowanie elementów rysunkowych systemu do aplikacji (co nie zapewnia spójnego interfejsu użytkownika w całym systemie dla wszystkich wersji Androida).
Vaios
2
@Ali_Waris dziękuję za opublikowanie odpowiedzi, chciałbym zrozumieć, że to rozwiązanie nie działa. Czy możesz rozszerzyć odpowiedź, tak aby obejmowała układ ConstraintLayout i wytyczne dotyczące odpowiedzi?
scottyab
Co to jest wytyczna? Gdzie to pójdzie?
iamgopal
zamiast guidline możesz użyć pustego widoku <Wyświetl aplikację: layout_constraintStart_toStartOf = "parent" app: layout_constraintEnd_toEndOf = "parent" android: id = "@ + id / guideline" android: layout_width = "0dp" android: layout_height = "0dp" android : orientacja = "pionowa" android: visibility = "niewidoczne" app: layout_constraintBottom_toBottomOf = "rodzic" />
Kochchy
16

Możliwe jest narysowanie wyśrodkowanego w pionie paska ProgressBar wewnątrz elementu nadrzędnego, który spowodowałby obcięcie wypełnienia. Ponieważ ProgressBar nie może narysować siebie większego niż element nadrzędny, musimy utworzyć dużego rodzica, aby umieścić go w widoku wycinania.

<FrameLayout
    android:id="@+id/clippedProgressBar"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="4dp"
    tools:ignore="UselessParent">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="16dp"
        android:layout_gravity="center_vertical">

        <ProgressBar
            style="?android:attr/progressBarStyleHorizontal"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:indeterminate="true"/>

    </FrameLayout>

</FrameLayout>
Juozas Kontvainis
źródło
1
To działało na Androidzie 7.0, ale nie spowodowało pojawienia się paska postępu na mojej Sony Xperia M z Androidem 4.1.2.
Sam
@Sam dzięki za zgłoszenie! Co zobaczysz, jeśli zmienisz wysokość pierwszego FrameLayout z 4dp na 48dp?
Juozas Kontvainis
Pojawia się pasek postępu, ale pod spodem jest dużo wypełnienia, a nad nim trochę wypełnienia.
Sam
@Sam Zaktualizowałem moją odpowiedź, mam nadzieję, że będzie działać zadowalająco na twoim urządzeniu Sony. Jeśli to nie pomoże, sugeruję przejrzenie konfiguracji motywu aplikacji. Używanie motywu Holo na KitKat powinno to naprawić.
Juozas Kontvainis
15

Aby usunąć pionowe wypełnienie ProgressBar, możesz to zrobić za pomocą

  • ustal wysokość ProgressBar
  • Użyj scaleY = "wartość" (wartość = wysokość / 4) (4 to domyślna wysokość paska postępu)

Przykład zawiera 1 wrap_content ProgressBar, 1 8dp ProgressBar1 100dpProgressBar

wprowadź opis obrazu tutaj

<ProgressBar
    style="?android:attr/progressBarStyleHorizontal"
    ...
    android:layout_height="8dp"
    android:scaleY="2" />
Phan Van Linh
źródło
14

Pełne rozwiązanie tego problemu byłoby następujące. Na wszelki wypadek, gdyby ktoś potrzebował fragmentów kodu, tak właśnie zrobiłem.

  1. Skopiowano wszystkie 8 nieokreślonych rysunków na poziomym pasku postępu
  2. Edytowałem rysunki za pomocą jakiegoś manipulatora obrazu i usunąłem niepotrzebne wypełnienia
  3. Skopiowano plik XML do rysowania o nazwie progress_indeterminate_horizontal_holo.xml z platformy Android
  4. Skopiowano styl Widget.ProgressBar.Horizontal i jego elementy nadrzędne
  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" />

Zasoby stylów 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>

I na koniec ustaw minimalną wysokość na 4 dp 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" />
Subin Sebastian
źródło
Skąd możemy skopiować element do rysowania wspomniany w kroku 1: „Skopiowano wszystkie 8 nieokreślonych rysunków z poziomym paskiem postępu”?
Greenhand
3
@JeffreyLin Skopiowałem to z tej lokalizacji<your-sdk-folder>/platforms/android-17/data/res/drawable-hdpi/
Subin Sebastian
33
Czy to nie zadziwiające, ile pracy trzeba wykonać, aby osiągnąć tak zdroworozsądkowe zachowanie, które powinno po prostu pojawić się domyślnie w Androidzie?
SpaceMonkey
1
A jeśli chodzi o projektowanie materiałów?
mrroboaat
@aat Nie sądzę, by wytyczne dotyczące materiałów miały podobne paski postępu. Przejrzyj ten dokument: google.com/design/spec/components/…
Subin Sebastian
10

Napotkałem ten sam problem podczas korzystania z progressbar w stylu poziomym.

Podstawową przyczyną jest to, że domyślny pasek postępu z 9 łatkami do rysowania: (progress_bg_holo_dark.9.png) ma kilka pionowych przezroczystych pikseli jako wypełnienie.

Ostateczne rozwiązanie, które zadziałało dla mnie: dostosuj postęp do rysowania, mój przykładowy kod w następujący sposób:

custom_horizontal_progressbar_drawable.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@android:id/background">
        <shape android:shape="rectangle">
            <solid android:color="#33ffffff" />
        </shape>
    </item>
    <item android:id="@android:id/secondaryProgress">
        <clip>
            <shape android:shape="rectangle">
                <solid android:color="#ff9800" />
            </shape>
        </clip>
    </item>
    <item android:id="@android:id/progress">
        <clip>
            <shape android:shape="rectangle">
                <solid android:color="#E91E63" />
            </shape>
        </clip>
    </item>
</layer-list>

fragment układu:

<ProgressBar
    android:id="@+id/song_progress_normal"
    style="@style/Widget.AppCompat.ProgressBar.Horizontal"
    android:layout_width="match_parent"
    android:layout_height="5dp"
    android:layout_alignParentBottom="true"
    android:progressDrawable="@drawable/custom_horizontal_progressbar_drawable"
    android:progress="0"/>
emocjefxxk
źródło
To chyba najlepsze rozwiązanie. Twój przykładowy kod nie wygenerował jednak paska postępu na mojej Sony Xperia M z systemem Android 4.1.2.
Sam,
8

Jedna sztuczka polega na dodaniu ujemnych marginesów do paska postępu.

Poniżej znajduje się przykład kodu XML, zakładając, że znajduje się on na górze ekranu:

<ProgressBar
    android:id="@+id/progressBar"
    style="@style/Widget.AppCompat.ProgressBar.Horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="-7dp"
    android:layout_marginBottom="-7dp"
    android:indeterminate="true" />

wynik kodu

chinmay.d
źródło
Dodanie ujemnych marż rozwiązało problem. Dzięki!
icarovirtual
5

Odpowiedź Subina wydaje się być jedyną (obecnie), która nie jest delikatnym hackiem, który może zepsuć się w przyszłych wersjach Androida ProgressBar.

Ale zamiast kłopotać się wyłamywaniem zasobów, modyfikowaniem ich i utrzymywaniem ich w nieskończoność, zdecydowałem się użyć biblioteki MaterialProgressBar , która robi to za nas:

<me.zhanghai.android.materialprogressbar.MaterialProgressBar
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:indeterminate="true"
    android:layout_gravity="bottom"
    custom:mpb_progressStyle="horizontal"
    custom:mpb_showTrack="false"
    custom:mpb_useIntrinsicPadding="false"
    style="@style/Widget.MaterialProgressBar.ProgressBar.Horizontal.NoPadding"
/>

W build.gradle:

// Android horizontal ProgressBar doesn't allow removal of top/bottom padding
compile 'me.zhanghai.android.materialprogressbar:library:1.1.6'

Ten projekt ma fajne demo, które pokazuje różnice między nim a wbudowanym ProgressBar.

Stephen Talley
źródło
4

jeśli ktoś wciąż szuka rozwiązania - sprawdź ten komentarz

ustaw minimalną wysokość na 4 dp

   android:minHeight="4dp"

-

  <ProgressBar
    android:id="@+id/web_view_progress_bar"
    style="@style/Widget.AppCompat.ProgressBar.Horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:indeterminate="false"
    android:max="100"
    android:min="0"
    android:progress="5"
    android:minHeight="4dp"
    android:progressTint="@color/vodafone_red"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    tools:progress="60" />
ahmed ewess
źródło
Wolę tę odpowiedź.
Sam Chen
2

Używam minHeight i maxHeigh. Pomaga w różnych wersjach API.

<ProgressBar
    android:id="@+id/progress_bar"
    style="@style/Base.Widget.AppCompat.ProgressBar.Horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:maxHeight="3dp"
    android:minHeight="3dp" />

Musi używać obu. Api 23 działa dobrze z platformami

android:layout_height="wrap_content"
android:minHeight="0dp"

Ale niższe wersje interfejsu API zwiększają wysokość paska postępu do maxHeight w tym przypadku.

Andrii Wołyniec
źródło
2

Spróbuj wykonać następujące czynności:

<ProgressBar
    android:id="@+id/progress_bar"
    style="@android:style/Widget.ProgressBar.Horizontal"
    android:progress="25"
    android:progressTint="@color/colorWhite"
    android:progressBackgroundTint="@color/colorPrimaryLight"
    android:layout_width="match_parent"
    android:layout_height="4dp" />

... a następnie skonfiguruj pasek postępu do swoich potrzeb, ponieważ początkowo będzie wyświetlał średni pasek z żółtym odcieniem postępu z szarawym odcieniem postępu. Zwróć też uwagę, że nie ma dopełnienia pionowego.

DaveNOTDavid
źródło
2

Użyj w ten sposób, wewnątrz Linearlayout

 <LinearLayout
        android:layout_width="match_parent"
        android:background="#efefef"
        android:layout_height="wrap_content">

        <ProgressBar
            android:id="@+id/progressBar"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:indeterminate="true"
            android:visibility="gone"
            android:layout_marginTop="-7dp"
            android:layout_marginBottom="-7dp"
            style="@style/Widget.AppCompat.ProgressBar.Horizontal"
            />

    </LinearLayout>
alizulfuqar
źródło
Działa świetnie! Następnym razem opisz, co robi Twój kod i jakie zmiany wprowadziłeś. ;-)
Developer From Jokela
1

dodanie android: progressDrawable do listy warstw zdefiniowanej w drawable rozwiązało problem. Działa poprzez maskowanie paska postępu w niestandardowym rysunku

przykładowa implementacja opisana na https://stackoverflow.com/a/4454450/1145905

kip2
źródło
1

Używam style="@style/Widget.AppCompat.ProgressBar.Horizontal"i dość łatwo było pozbyć się marginesów. Ten styl to:

    <item name="progressDrawable">@drawable/progress_horizontal_material</item>
    <item name="indeterminateDrawable">@drawable/progress_indeterminate_horizontal_material</item>
    <item name="minHeight">16dip</item>
    <item name="maxHeight">16dip</item>

Właśnie przekroczyłem minimalną / maksymalną wysokość:

    <ProgressBar
        style="@style/Widget.AppCompat.ProgressBar.Horizontal"
        android:layout_width="match_parent"
        android:layout_height="2dp"
        android:indeterminate="true"
        android:minHeight="2dp"
        android:maxHeight="2dp" />
Anthony
źródło
Nigdy nie byłem zadowolony z ogólnego paska postępu i ostatecznie zwróciłem się do biblioteki: me.zhanghai.android.materialprogressbar.MaterialProgressBar
Anthony
1

Nie trzeba pobierać żadnego nowego modułu ani nawet umieszczać układu FrameLayout na pasku postępu. To wszystko to tylko hacki. Tylko 2 kroki:

W pliku what.xml

<ProgressBar
    android:id="@+id/workoutSessionGlobalProgress"
    android:layout_width="match_parent"
    android:layout_height="YOUR_HEIGHT"
    android:progressDrawable="@drawable/progress_horizontal"
    android:progress="0"
    <!-- High value to make ValueAnimator smoother -->
    android:max="DURATION * 1000"
    android:indeterminate="false"
    style="@style/Widget.MaterialProgressBar.ProgressBar.Horizontal"/>

progress_horizontal.xml, Zmień wartości według własnego uznania.

Nie lubisz zaokrąglonych rogów?
Usuń promień narożnika

Nie lubisz kolorów? Zmień kolory itp. Gotowe!

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:id="@android:id/background">
        <shape>
            <corners android:radius="5dip" />
            <gradient
                    android:startColor="#ff9d9e9d"
                    android:centerColor="#ff5a5d5a"
                    android:centerY="0.75"
                    android:endColor="#ff747674"
                    android:angle="270"
                    />
        </shape>
    </item>

    <item android:id="@android:id/secondaryProgress">
        <clip>
            <shape>
                <corners android:radius="5dip" />
                <gradient
                        android:startColor="#80ffd300"
                        android:centerColor="#80ffb600"
                        android:centerY="0.75"
                        android:endColor="#a0ffcb00"
                        android:angle="270"
                        />
            </shape>
        </clip>
    </item>

    <item android:id="@android:id/progress">
        <clip>
            <shape>
                <corners android:radius="5dip" />
                <gradient
                        android:startColor="#ffffd300"
                        android:centerColor="#ffffb600"
                        android:centerY="0.75"
                        android:endColor="#ffffcb00"
                        android:angle="270"
                        />
            </shape>
        </clip>
    </item>

</layer-list>

Ogólnie rzecz biorąc, są to kroki, aby zmienić kod czegoś, czego nie lubisz. Po prostu znajdź kod źródłowy i dowiedz się, co zmienić. Jeśli zastosujesz się do kodu źródłowego ProgressBar, znajdziesz plik o nazwie progress_horizontal.xml, do którego się on odnosi. Zasadniczo, jak rozwiązuję wszystkie moje problemy z XML.

Daniel Kim
źródło
0
 <ProgressBar
        android:layout_marginTop="-8dp"
        android:layout_marginLeft="-8dp"
        android:layout_marginRight="-8dp"
        android:id="@+id/progress_bar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="4dp"
        android:indeterminate="false"
        android:indeterminateTint="@color/white"
        android:max="100"
        android:paddingStart="8dp"
        android:paddingRight="0dp"
        android:progressDrawable="@drawable/progress_bg" />
mallem mahesh
źródło
0
<androidx.core.widget.ContentLoadingProgressBar
                    android:id="@+id/progressBar"
                    style="@style/Widget.AppCompat.ProgressBar.Horizontal"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:indeterminate="true"
                    android:paddingTop="2dp"
                    app:layout_constraintTop_toTopOf="parent"
                    app:layout_constraintBottom_toTopOf="parent"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintStart_toStartOf="parent"/>
ZIRES
źródło
Nie wysyłaj po prostu kodu pocztowego. Podaj kontekst swojej odpowiedzi.
Martin Gal
0

Po prostu skorzystaj z Material ProgressIndicator, który nie ma ukrytego marginesu.

<com.google.android.material.progressindicator.ProgressIndicator
        android:id="@+id/progressBar"
        style="@style/Widget.MaterialComponents.ProgressIndicator.Linear.Indeterminate"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:indicatorColor="@color/colorPrimary"
        app:trackColor="@color/colorAccent" />
devgun
źródło
-1

Proste rozwiązanie bez sztuczek, które jest kompatybilne z każdą wersją Androida i nie wymaga zewnętrznych bibliotek, udaje ProgressBarz dwoma w ViewsśrodkuLinearLayout . Na tym skończyłem. Wygląda całkiem schludnie, a to podejście jest dość elastyczne - możesz animować go w zabawny sposób, dodawać tekst itp.

Układ:

<LinearLayout
    android:id="@+id/inventory_progress_layout"
    android:layout_width="match_parent"
    android:layout_height="4dp"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/inventory_progress_value"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <TextView
        android:id="@+id/inventory_progress_remaining"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

Kod:

public void setProgressValue(float percentage) {
    TextView progressValue = (TextView) findViewById(R.id.inventory_progress_value);
    TextView progressRemaining = (TextView) findViewById(R.id.inventory_progress_remaining);

    LinearLayout.LayoutParams paramsValue = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
    LinearLayout.LayoutParams paramsRemaining = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

    paramsValue.weight = (100 - percentage);
    paramsRemaining.weight = percentage;

    progressValue.setLayoutParams(paramsValue);
    progressRemaining.setLayoutParams(paramsRemaining);

}

Wynik (po dodaniu pewnej wysokości):

wprowadź opis obrazu tutaj

Janeks Bergs
źródło
-1

Najlepszym rozwiązaniem powinno być

android:minHeight="0dp"

Brak obejścia i działa jak urok.

Alex Fan
źródło
nie zadziałało, czy możesz wyjaśnić, dlaczego to powinno działać?
humble_wolf
@humble_wolf To zadziałało w moim poprzednim projekcie, kiedy napisałem odpowiedź; może zależeć od jakiejś konkretnej wersji biblioteki? Powinno działać, ponieważ powodem, dla którego istnieje wypełnienie podobne do rzeczy dla paska postępu, nie jest faktyczne wypełnienie, ale jest minHeightwstępnie zdefiniowane, które jest większe niż 0 (powiedzmy, że może 32dp). Zmieniając tę ​​właściwość, uzyskasz inny wygląd.
Alex Fan,
Nie działał dla mnie w trybie Inderminate = true, może działając w trybie zdeterminowanym. Jeśli naprawdę chcesz, aby była to odpowiedź, napisz wyjaśnienie w odpowiedzi ze wszystkimi warunkami.
humble_wolf