7

几天来我一直在玩 L 预览,似乎不起作用的一件事是android:elevation视图的属性。调用时它工作得很好View.setElevation(),但它似乎忽略了 XML 属性。我正在使用 Android Studio 0.8.2 并minSdkVersion设置targetSdkVersion'L',并compileSdkVersion设置为'android-L'. buildToolsVersion"20.0.0"。这是一个无法正常工作的示例布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.v7.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:layout_margin="10dp"
        android:elevation="5dp">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="top"/>

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

    <android.support.v7.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:layout_margin="10dp"
        android:elevation="0dp">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="bottom"/>

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

</LinearLayout>

这是结果的屏幕截图:imgur.com/mqeq9vK

根据android:elevation我的设置,底牌应该平放在“地面”上,但事实并非如此。事实上,它看起来和顶牌的海拔没有什么不同5dp。这是一个已知问题吗?它对您有用吗?

编辑:似乎CardView只有Buttons. 在这个布局中,我用 替换CardViewButton,即使阴影有点搞砸了(已知错误),您仍然可以看到高程的差异。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:elevation="2dp"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:elevation="1dp"/>

</LinearLayout>

编辑 2:几乎可以确认此问题仅影响CardViewandroid:elevation适用于任何其他视图。有关为什么会发生这种情况的详细解释,请查看接受的答案。同时,我的解决方法是CardView用 a替换FrameLayout并设置android:background为可绘制对象。这是一个有效的卡片背景可绘制示例:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
    <solid android:color="#fff" />
</shape>

我也将此作为一个错误提交,所以如果它影响到你,请给这个问题加注星标。https://code.google.com/p/android-developer-preview/issues/detail?id=731

4

4 回答 4

8

CardView 在初始化期间设置自己的高度,这将覆盖您从 XML 设置的任何内容。您应该在https://code.google.com/p/android-developer-preview/wiki/FilingIssues?tm=3将此作为错误提交

@Override
public void initialize(CardViewDelegate cardView, Context context, int backgroundColor,
        float radius) {
    cardView.setBackgroundDrawable(new RoundRectDrawable(backgroundColor, radius));
    View view = (View) cardView;
    view.setClipToOutline(true);
    view.setElevation(context.getResources().getDimension(R.dimen.cardview_elevation));
}
于 2014-07-11T19:49:33.893 回答
3

请使用cardElevation属性在 CardView 上设置高度。这也会影响 pre-L 的阴影大小。

此外,请参阅其他属性的文档

于 2014-10-22T18:22:56.420 回答
1

请将此添加到您的根目录中

xmlns:card_view="http://schemas.android.com/apk/res-auto"

下面是cardview的代码

<android.support.v7.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    card_view:cardElevation="10dp"
    android:id="@+id/view" >
    .
    .
    .
    .
    .
    Child
    .
    .
    .
    .

</android.support.v7.widget.CardView>
于 2015-09-08T10:40:50.903 回答
0

错误修复发布之前,您可以以编程方式对其进行设置。

我已经这样做了RecyclerView

在您的 RecyclerView.Adapter 中:

public class MyAdapter extends RecyclerView.Adapter<TripsAdapter.ViewHolder> {

    /* ... */

    public class ViewHolder extends RecyclerView.ViewHolder {
        CardView card;

        public ViewHolder(View itemView) {
            card = (CardView) itemView.findViewById(R.id.card_view);
        }
    }

    /* ... */

    @Override public void onBindViewHolder(ViewHolder holder, int position) {
        /// ...

        // Update Card Elevation
        final float scale = mContext.getResources().getDisplayMetrics().density;
        holder.card.setElevation(1f * scale);    //TODO set this in xml once CardView elevation bug is fixed
    }

}
于 2014-10-21T03:27:36.353 回答