android:elevation在L预览版中无效。

7
我已经使用L预览版玩了几天,有一件事似乎不起作用,那就是对于视图的android:elevation属性。当调用View.setElevation()时它可以正常工作,但是它似乎忽略了XML属性。我使用的是Android Studio 0.8.2,并且将minSdkVersiontargetSdkVersion设置为'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的问题。在这个布局中,我用Button替换了CardView,即使阴影有点问题(已知的错误),你仍然可以看到高度的差异。
<?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替换为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个回答

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));
}

谢谢,这证实了我的猜测。我会提交那个错误报告,同时想出另一种方法。 - IvonLiu
@alanv 你知道现在Lollipop已经正式发布,这个Bug还存在吗?我仍然无法在XML中使其工作。 - TheLettuceMaster
1
你应该使用cardElevation属性(如另一个答案中由CardView的开发者yigit提到)。 - alanv

3

请使用cardElevation属性在CardView上设置高程。这也会影响到早期版本中的阴影大小。

此外,请查看文档以获取其他属性。


似乎这是在官方SDK发布之后添加的。无论如何,感谢您让我知道这个属性!在早期的Android版本中轻松控制阴影大小的能力是一个明显的好处。 - IvonLiu

1
请将此添加至您的根目录。
xmlns:card_view="http://schemas.android.com/apk/res-auto"

以下是卡片视图的代码。
<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>

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
    }

}

无效,同时setElevation方法仅适用于Android 5,因此还需要添加操作系统版本检查。 - Shajeel Afzal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接