2014-07-11 53 views
7

我一直在玩L預覽幾天,而有一件看起來不起作用的是視圖的android:elevation屬性。當調用​​時它工作得很好,但它似乎忽略了XML屬性。我正在使用Android Studio 0.8.2,並將minSdkVersiontargetSdkVersion設置爲'L',將compileSdkVersion設置爲'android-L'buildToolsVersion"20.0.0"。下面是一個簡單的佈局,不能正常工作:android:仰角在L預覽中不起作用

<?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,即使陰影有點被搞砸(已知的bug),仍然可以看到高程的差異。

<?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任何其他視圖正常工作。有關發生這種情況的詳細解釋請看公認的答案。同時,我的解決方法是用FrameLayout替換CardView,並將android:background設置爲drawable。這是一個卡的背景繪製的作品的例子:

<?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> 

我也提起這個bug,所以請明星這個問題,如果它影響到你。 https://code.google.com/p/android-developer-preview/issues/detail?id=731

回答

8

CardView在初始化過程中設置自己的高程,它將覆蓋從XML設置的任何值。直到bug解決方案發布前,你可以通過編程設置你應該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)); 
} 
+0

謝謝你的代碼,這證實了我懷疑的。我將提交該錯誤,同時我將制定一個不同的方法。 – IvonLiu

+0

@alanv你知道現在棒棒糖是否正式退出,這是否仍然是一個錯誤?我仍然無法讓它在XML中工作。 – KickingLettuce

+1

您應該使用cardElevation屬性(如yigit的另一個答案中所述,CardView的開發人員)。 – alanv

0

提交這個bug。

我在一個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 
    } 

} 
+0

不工作也setElevation方法只在android 5中可用,所以OS版本檢查也需要添加。 –

3

請使用cardElevation屬性設置海拔在CardView。這也會影響L之前的影子尺寸。

此外,請參閱documentation瞭解其他屬性。

+0

似乎是在官方SDK發佈後添加的。儘管如此,謝謝你讓我知道這個屬性!輕鬆控制棒棒糖前的陰影大小的能力是一個明顯的好處。 – IvonLiu

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>