2016-01-12 16 views
9

RecyclerView要素の場合、予期しない動作が多少発生しています(ItemDecoration)。ProguardとRecyclerViewアイテムの装飾

一部の電話機(Samsung Android 5デバイス)では、proguardがビルドに適用されたときにItemDecorationが表示されません(trueを縮小します)。 proguard/minifyがうまくいけば、リサイクラの要素間のItemDecorationを見ることができます。

ほとんどの電話では、この問題は存在しません。プロガードの有無にかかわらずアイテムの装飾が表示されます。

何が起こっているのかわかりませんが、入力がわかります。

項目デコレータコード:

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.drawable.Drawable; 
import android.support.v4.content.ContextCompat; 
import android.support.v7.widget.RecyclerView; 
import android.util.Log; 
import android.view.View; 

public class DividerItemDecoration extends RecyclerView.ItemDecoration { 
    private Drawable mDivider; 

    public DividerItemDecoration(Context context) { 
     mDivider = ContextCompat.getDrawable(context, R.drawable.line_divider); 
    } 

    @Override 
    public void onDrawOver(Canvas canvas, RecyclerView parent, RecyclerView.State state) { 
     int left = parent.getPaddingLeft(); 
     int right = parent.getWidth() - parent.getPaddingRight(); 

     int childCount = parent.getChildCount(); 
     for (int i = 0; i < childCount; i++) { 
      View child = parent.getChildAt(i); 
      RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); 

      int top = child.getBottom() + params.bottomMargin; 
      int bottom = top + mDivider.getIntrinsicHeight(); 
      int margin = 30; 
      mDivider.setBounds(left + margin, top, right - margin, bottom); 
      mDivider.draw(canvas); 
     } 
    } 
} 

line_divider.xml:

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle"> 
    <size 
     android:width="1dp" 
     android:height="1dp" /> 
    <solid android:color="#ffc6c6c6" /> 
</shape> 

ProGuardのルール:

-keepclassmembers class fqcn.of.javascript.interface.for.webview { 
    public *; 
} 

# support design library 
-dontwarn android.support.design.** 
-keep class android.support.design.** { *; } 
-keep interface android.support.design.** { *; } 
-keep public class android.support.design.R$* { *; } 


#retrofit 
-dontwarn retrofit.** 
-keep class retrofit.** { *; } 
-keep class com.myappspackage.catalog.** { *; } 

#OKHttp 
-dontwarn okio.** 
-keep class okio.** { *; } 

-dontwarn org.slf4j.** 
-keep class org.slf4j.** { *; } 

-keep class android.support.v7.** { *; } 
-keep interface android.support.v7.** { *; } 

-keepattributes Signature 
-keepattributes Exceptions 

#Google analytics 
-keep class com.google.android.gms.** { *; } 
-keep public class com.google.android.gms.** 
-dontwarn com.google.android.gms.** 

のGradleログを構築:

Executing tasks: [clean, :app:generateReleaseSources] 

Configuration on demand is an incubating feature. 
:app:clean 
:app:preBuild UP-TO-DATE 
:app:preReleaseBuild UP-TO-DATE 
:app:checkReleaseManifest 
:app:preDebugBuild UP-TO-DATE 
:app:prepareComAndroidSupportAppcompatV72311Library 
:app:prepareComAndroidSupportCardviewV72311Library 
:app:prepareComAndroidSupportDesign2311Library 
:app:prepareComAndroidSupportRecyclerviewV72311Library 
:app:prepareComAndroidSupportSupportV42311Library 
:app:prepareComCrashlyticsSdkAndroidAnswers131Library 
:app:prepareComCrashlyticsSdkAndroidBeta113Library 
:app:prepareComCrashlyticsSdkAndroidCrashlytics251Library 
:app:prepareComCrashlyticsSdkAndroidCrashlyticsCore234Library 
:app:prepareComGoogleAndroidGmsPlayServicesAnalytics840Library 
:app:prepareComGoogleAndroidGmsPlayServicesBase840Library 
:app:prepareComGoogleAndroidGmsPlayServicesBasement840Library 
:app:prepareComGoogleAndroidGmsPlayServicesGcm840Library 
:app:prepareComGoogleAndroidGmsPlayServicesMeasurement840Library 
:app:prepareDeHdodenhofCircleimageview130Library 
:app:prepareIoFabricSdkAndroidFabric135Library 
:app:prepareReleaseDependencies 
:app:compileReleaseAidl 
:app:compileReleaseRenderscript 
:app:generateReleaseBuildConfig 
:app:generateReleaseAssets UP-TO-DATE 
:app:mergeReleaseAssets 
:app:processReleaseManifest 
:app:fabricGenerateResourcesRelease 
:app:generateReleaseResValues UP-TO-DATE 
:app:generateReleaseResources 
:app:mergeReleaseResources 
AAPT: /Users/aviran/Projects/app/src/main/res/drawable-xhdpi/ic_drawer.png: libpng warning: iCCP: Not recognizing known sRGB profile that has been edited 
AAPT: /Users/aviran/Projects/app/src/main/res/drawable-hdpi/ic_drawer.png: libpng warning: iCCP: Not recognizing known sRGB profile that has been edited 
AAPT: /Users/aviran/Projects/app/src/main/res/drawable-mdpi/ic_drawer.png: libpng warning: iCCP: Not recognizing known sRGB profile that has been edited 
:app:processReleaseResources 
:app:generateReleaseSources 

BUILD SUCCESSFUL 

Total time: 30.549 secs 

スーパー奇妙な溶液

forループ内Log.i(TAG, "decorating: " + i);を追加、実際には各項目の線を引くことができます。 forループの外側に置くことはできません。一体どんなアイデアがそこに起こっているの?

+0

最も重要な入力は、ここで受け取ることができます。欠けていることの手掛かりをlogcatの出力で確認してください(そしてproguardの設定を変更してそのまま残してください)。 – mah

+0

@mahここにsamsung S5のlogcatのペーストビンがあります。関連するかもしれないものは何も見ません。どうぞご覧ください。 http://pastebin.com/wb9CaS79(アプリケーションのパッケージ名はcom.company.myAppName) – aviran

+0

あなたは 'RecyclerView'ライブラリのバージョンを使用していますか?あなたの 'Proguard'設定は何ですか? 'minify'が有効になっているときにビルドログをチェックしましたか?ありがとう。 – fasteque

答えて

0

これはあなたの質問に直接答えませんが、うまくいく可能性があります。あなたにできることはdoesntの作品が

-keepattributes *Annotation*, InnerClasses, Signature 

あなたの全体のコードは、大きなコードのリークではないアイテムデコレータを残して難読化されたこの方法で試してください上記の場合、エントリ

-keep class yourpakganame.itemdecorator 
-keep public class * extends android.support.v7.widget.RecyclerView.ItemDecoration 
-keep class android.support.v7.widget.RecyclerView 

を作るあなたのProGuardのファイルであります:P

+0

これは、私が試した最初のことですが、動作しませんでした。 – aviran

+0

okもう一度更新された答えのようなRecyclerView.ItemDecorationのエントリ – ingsaurabh

+0

ちょうどそれを試して、動作しません。私は問題がItemDecorator obfoscatedされているとは思わない、何かが途中で失われます。 – aviran

関連する問題