2015-08-25 23 views
5

Tak więc mam ten plik układu (poniżej). Jak widać, nie ma dopełnienia ani marginesu. Pliki dimen.xml również nie mają żadnego dopełnienia/marginesu. Na koniec NIE zmieniam programowo wcale.Układ Android niechciane wyściełanie

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      xmlns:tools="http://schemas.android.com/tools" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      xmlns:app="http://schemas.android.com/apk/res-auto" 
      android:id="@+id/root" 
      android:padding="0dp" 
      android:orientation="vertical"> 

      <android.support.v7.widget.CardView 
       android:id="@+id/toolbarholder" 
       android:layout_alignParentTop="true" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       app:cardElevation="16dp" 
       app:cardCornerRadius="0dp"> 
      <android.support.v7.widget.Toolbar 
       android:id="@+id/toolbar" 
       android:layout_width="match_parent" 
       android:layout_height="?attr/actionBarSize" 
       android:background="?attr/colorPrimary" 
       app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 



      </android.support.v7.widget.Toolbar> 
      </android.support.v7.widget.CardView> 


      <ListView 
       android:layout_below="@+id/toolbarholder" 
       android:layout_above="@+id/cardroot" 
       android:id="@+id/listView" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:layout_alignParentLeft="true" 
       android:layout_alignParentStart="true" 
       android:divider="@null" 
       android:dividerHeight="0dp" 
       android:layout_marginTop="0dp" /> 


      <android.support.v7.widget.CardView 
       xmlns:android="http://schemas.android.com/apk/res/android" 
       xmlns:app="http://schemas.android.com/apk/res-auto" 
       android:id="@+id/cardroot" 
       android:layout_width="match_parent" 
       android:layout_height="100dp" 
       android:background="@color/transparentblack" 
       app:cardCornerRadius="0dp" 
       app:cardElevation="16dp" 
       android:layout_alignParentBottom="true"> 

       <RelativeLayout 
        android:layout_width="match_parent" 
        android:layout_height="match_parent"> 

        <LinearLayout 
         android:id="@+id/buttonholder" 
         android:layout_width="match_parent" 
         android:layout_height="wrap_content" 
         android:layout_marginTop="20dp" 
         android:weightSum="3"> 

         <ImageView 
          android:id="@+id/previous" 
          android:layout_width="35dp" 
          android:layout_height="35dp" 
          android:src="@drawable/previous" 
          android:layout_weight="1"/> 
         <ImageView 
          android:id="@+id/play" 
          android:layout_width="35dp" 
          android:layout_height="35dp" 
          android:src="@drawable/play" 
          android:layout_weight="1"/> 
         <ImageView 
          android:id="@+id/next" 
          android:layout_width="35dp" 
          android:layout_height="35dp" 
          android:src="@drawable/next" 
          android:layout_weight="1"/> 

        </LinearLayout> 

        <SeekBar 
         android:id="@+id/seekbar" 
         android:layout_width="match_parent" 
         android:layout_height="wrap_content" 
         android:layout_below="@+id/buttonholder" /> 

       </RelativeLayout> 

      </android.support.v7.widget.CardView> 

     </RelativeLayout> 

Poniżej znajdują się dwa zrzuty ekranu z dwóch różnych urządzeń.

Lenovo K3 Uwaga:

enter image description here

HTC Desire 550:

enter image description here

jakieś pomysły co może być przyczyną tego?

+0

Dlaczego umieszczasz swój "Pasek narzędzi" wewnątrz karty? A nie tylko na układzie? I czy to twój pełny XML? Czy są jakieś układy nadrzędne? Czy to jest "Activity" czy "Fragment"? – Mauker

+1

To "sztuczka/hack" używam, aby zapewnić atrybut "elewacji" dla paska narzędzi, dla urządzeń pre-Lollipop. Ponieważ pasek narzędzi Toolbar nie obsługuje atrybutu elewacji, ale robi to biblioteka pomocnicza Cardview. – Cbr

+0

O, widzę. Ciekawe rozwiązanie;) – Mauker

Odpowiedz

7

Ok Guys ... dziękuję za twój wkład. Okazuje się, że: "Cardview Documentation" wspomina, że:

Przed L, CardView dodaje dopełnienie do swojej zawartości i rysuje cienie do tego obszaru. Ta wielkość wypełnienia jest równa maxCardElevation + (1 - cos45) * cornerRadius po bokach i maxCardElevation * 1,5 + (1 - cos45) * cornerRadius na górze i na dole.

Oznacza to, że margines jest przeznaczony do rysowania cieni i symulowania elewacji. Jednym z możliwych rozwiązań dla wszystkich mających ten sam problem, jest użyć atrybutu cardUseCompatPadding w układzie, co następuje:

<android.support.v7.widget.CardView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    app:cardElevation="0dp" 
    app:cardUseCompatPadding="true"> 
</android.support.v7.widget.CardView> 

To spowoduje, że układ do „wydanego” w ten sam sposób (pre-Lollipop sposób // smutny) w każdym urządzeniu bez względu na API. Przynajmniej w ten sposób możemy naprawić wspólny układ, który działa dla wszystkich wersji z tym ograniczeniem.

Mam nadzieję, że to pomaga.

AKTUALIZACJA: Jeśli zdecydujesz się na "app: cardUseCompatPadding = true", oto kolejna porada. Użyj negatywowej layout_margin, aby zrównoważyć niechciane wypełnienie z biblioteki compat. Przykład poniżej:

<android.support.v7.widget.CardView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_margin="-10dp" 
    app:cardCornerRadius="0dp" 
    app:cardUseCompatPadding="true" 
    app:cardElevation="8dp"> 
</android.support.v7.widget.CardView> 

ten sposób Twój układ może pozbyć się niechcianych padding i wyglądają tak samo pre-lizak i po lizaka.

Mam nadzieję, że to pomoże jeszcze bardziej.:)

+0

Dobrze o tym wiedzieć. Świetne znalezisko! –

+0

Niezły. Doskonałe znalezisko! – Mauker

0

Możliwym powodem jest to, że telefony komórkowe HTC mają różne rodzaje wewnętrznych plików układu. Tak więc Lenovo Nexus i SAMSUNG mogą działać poprawnie, ale dzięki różnicy HTC w tych sytuacjach jest to duży problem dla wielu programistów. Jeśli naprawdę chcesz, aby działało również na HTC, polecam najlepszy sposób na sprawienie, aby HTC działał na twoich własnych plikach xml, które przypominają Android. Polecam, jeśli chcesz kontynuować, postaraj się zawiesić natywny plik xml na karcie Android i użyć tego samego. Teraz HTC musi używać twoich niestandardowych, które są równe wszystkim innym androidom, ale nie w HTC. Mówię tylko, że teraz będzie działać poprawnie na wszystkich urządzeniach. Ale bądź ostrzeżony, to może okazać się długie i bolesne, jeśli nie możesz się pozbyć natywnego pliku xml. Jeśli to zrobisz, prawdopodobnie stanie się dla Ciebie bryzą. Mam nadzieję, że mnie rozumiesz.

+0

Dziękuję za odpowiedź .... Właśnie zauważyłem, że ma to związek z poziomem interfejsu API urządzeń. W podglądzie układu Android w Androidzie widzę, że dla interfejsu API docelowego 15 lub niższego wyświetla układ z dopełnieniem. Zajrzę do niego i wrócę :) – Cbr

+0

Ok. Ale HTC na ogół to robi. W innym starszym pytaniu również jest tak, że HTC jest trochę inny. –

0

Czy próbowałeś ustawić wysokość układu liniowego lub ustawić go tak, aby pasował do rodzica? Wygląda na to, że nie ma dodatkowego dopełnienia, ale raczej, że twoje pozycje na liście nie mają tej samej wysokości, co obraz, który zostanie odcięty.

+0

Tak, próbowałem kilku rozwiązań tego typu, np. Dziwne z wysokościami, szerokościami itp. Sprawdź moją odpowiedź, myślę, że mam rację dobrze :) – Cbr