2016-12-22 43 views
5

我有一個項目,其中包含了很多drawables,它們以「a」或「b」開頭(例如a1_back,a2_back, b1_start,b2_start等等)。這些可繪製不是在代碼中使用,但使用如下代碼:Android:使「shrinkResources真」保持所有可繪製,但刪除其他未使用的資源

String name = image.getName();//getName() returns for examle "a1_back" 
res = getResources().getIdentifier(name, "drawable", getPackageName()); 

於是,無處代碼我有特定的字符串「a1_back」使用。這就是爲什麼當我將「shrinkResources true」設置爲時,我所有以「a」和「b」開頭的drawable都被刪除。

我讀過,你可以指定哪些資源使用下面的XML文件,以保持:

<?xml version="1.0" encoding="utf-8"?> 
<resources xmlns:tools="http://schemas.android.com/tools" 
    tools:keep="@layout/l_used_c" 
    tools:discard="@layout/unused2" /> 

但我有辦法許多可繪製並不願意單獨逐一指定。有沒有一種方法可以在「工具:保持」中設置一個模式(以保留所有以「a」或「b」開頭的drawable),或者可以使所有drawable保留在項目中,但刪除其他未使用的資源?

在此先感謝! :)

+0

如果你正在處理,只有資源,機器人工作室用這一招在Android User Guide解釋有一個選項,點擊** **重構** >>刪除未使用的資源**。 –

+0

是的,但我不希望我的drawable被刪除!我想保留它們,但刪除一切。 – hkop

+0

運行刪除未使用的資源,然後使用源代碼管理程序恢復繪圖。 – nasch

回答

1

有一種解決方法,您可以使用。添加一個前綴要保持

@Nullable 
private Drawable getDrawableByName(@NonNull final Context context, @NonNull final String name) { 
    final String prefixName = String.format("prefix_%s", name); 
    return getDrawable(context, prefixName); 
} 

@Nullable 
protected Drawable getDrawable(@NonNull final Context context, @NonNull final String name) { 
    final Resources resources = context.getResources(); 
    final int resourceId = resources.getIdentifier(name, "drawable", context.getPackageName()); 
    try { 
     return resources.getDrawable(resourceId, context.getTheme()); 
    } catch (final Resources.NotFoundException exception) { 
     return null; 
    } 
} 

這裏的竅門都繪項目

final String prefixName = String.format("prefix_%s", name); 

資源萎縮的機制分析,隨着「prefix_」所有可繪製可以使用,不接觸這些文件。

2

當動態訪問資源,用這個例子

String name = String.format("img_%1d", angle + 1); 
res = getResources().getIdentifier(name, "drawable", getPackageName());