0

Я внедрил макет, состоящий из CardView внутри CardView, используя библиотеку поддержки AppCompat для CardView. Первый макет - это первый слой, а второй - на нем. Все хорошо на Lollipop, но, как заявлено Android dev doc, добавляется дополнительное дополнение для создания теней на пре-L-версиях.CardView внутри CardView: удалите дополнительную прокладку

Вот версия L:

L CardView version

и версия предварительного L:

Pre-L CardView version

Я пробовал много обходных путей от других сообщений, чтобы удалить эти дополнительные paddings, но ничего не получилось. Возможно, я что-то пропустил, но не знаю, что.

Вот мой код макета (я использую AppCompat-v7 R23):

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="80dp" 
    android:id="@+id/adapter_line_favorites" 
    android:clickable="false"> 

    <android.support.v7.widget.CardView 
     xmlns:card_view="http://schemas.android.com/apk/res-auto" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal" 
     card_view:cardPreventCornerOverlap="false" 
     card_view:contentPadding="0dp" 
     card_view:cardCornerRadius="4dp" 
     android:layout_marginTop="10dp" 
     android:layout_marginBottom="15dp" 
     android:layout_marginRight="10dp" 
     android:layout_marginLeft="10dp"> 

     <LinearLayout 
      android:orientation="vertical" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_alignParentBottom="false" 
      android:layout_alignParentRight="false" 
      android:layout_alignParentEnd="false"> 

      <android.support.v7.widget.CardView 
       xmlns:card_view="http://schemas.android.com/apk/res-auto" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:layout_gravity="center_horizontal" 
       card_view:cardBackgroundColor="@color/CyanPrimaryDark" 
       card_view:cardCornerRadius="4dp" 
       android:id="@+id/line_layout"> 

       <FrameLayout 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"> 

        <LinearLayout 
         android:orientation="vertical" 
         android:layout_width="match_parent" 
         android:layout_height="70dp" 
         android:layout_gravity="center_horizontal"> 

         <ImageView 
          android:layout_width="40dp" 
          android:layout_height="40dp" 
          android:id="@+id/line_icon" 
          android:layout_gravity="center" 
          android:layout_marginTop="15dp" /> 

        </LinearLayout> 

        <ImageView 
         android:layout_width="30dp" 
         android:layout_height="30dp" 
         android:id="@+id/dropdown" 
         android:layout_gravity="center_vertical|right" 
         android:layout_marginRight="20dp" 
         android:focusableInTouchMode="false" 
         android:src="@drawable/ic_action_keyboard_arrow_down" /> 
       </FrameLayout> 

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

      <LinearLayout 
       android:orientation="vertical" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:id="@+id/inner_favorite" 
       android:visibility="gone"> 

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

Если кто-нибудь имеет хорошее решение работать на L и предварительно L версии я более чем интересно!

ответ

1

Проблема в том, что вы используете CardView из библиотеки поддержки. Этот Cardview использует свой собственный механизм заполнения/тени на pre-L (api21.) Единственный способ исправить это - использовать ваш адаптер в разных макетах карт для устройств pre-L.

Similar question here. Вот пример, обратите внимание на метод «defineLayout()» в createviewholder.

public class adapter_overview extends RecyclerView.Adapter<adapter_overview.AdapterViewHolder>{ 

public ArrayList<String> vehicleList = new ArrayList<>(); 
private View itemView; 

public adapter_overview(ArrayList<String> vehicleList) { 
    this.vehicleList.addAll(vehicleList.values()); 
} 

@Override 
public int getItemCount() { 
    return vehicleList.size(); 
} 

@Override 
public AdapterViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
    itemView = LayoutInflater 
      .from(viewGroup.getContext()) 
      .inflate(determineLayout(), viewGroup, 

    return new AdapterViewHolder(itemView); 
} 

@Override 
public void onBindViewHolder(AdapterViewHolder adapterViewHolder, int i) { 
    //do bind stuff 
    } 
} 

public int determineLayout(){ 
     if(Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT){ 
      return R.layout.card_overview_v19; 

     }else{ 
      return R.layout.card_overview; 

    } 
} 

public static class AdapterViewHolder extends RecyclerView.ViewHolder{ 


    public AdapterViewHolder(View view) { 
     super(view); 

     //set up text view/etc 
    } 
} 

}

+0

Я думаю, что это хороший обходной путь, но довольно трудно просто удалить Прокладки. Я использовал два разных файла 'dimens' для обработки разного размера. Поскольку размер заполнения зависит от известных переменных, а не от размера экрана, мы можем исправить некоторые константы. –