2013-07-02 17 views
1

通常,當涉及到使用過時的方法,我們使用這樣的事情處理不贊成的方法

public static void SetBackground(View view, Drawable icon) { 
    if (Build.VERSION.SDK_INT >= 16) 
     Helper.SetBackground(view, icon); 
    else view.setBackgroundDrawable(icon); 
} 

public class Helper { 
    public static void SetBackground(View view, Drawable icon) { 
     view.setBackground(icon); 
    } 
} 

現在,它只是一個例子。我的問題是,如果在將來的API中刪除不推薦使用的方法,那麼應用程序最終會顯示VerifyError,因爲它無法找到它,就像這裏是View.setBackgroundDrawable。也許我們需要使用Helper2類。

回答

0

一種方式是像你提到的API級別。但更好的方法是使用反射,看看是否該方法是由Android版本或支持故障正常/使用更新的方法

public static Method getResources; 

    static { 
      try { 
        Class<?> class[] = new Class[1]; 
        class[0] = String.class; 
        getResources= Context.class.getMethod("getResources", class); 
      } catch (NoSuchMethodException e) { 
        Log.e(TAG, "getResources is deprecated"); 
      } 
    } 

把上面的擴展應用類的類,然後調用它這樣

MyClass extends Application { ...} 

if(MyClass.getResources!= null){ 
      //Do stuff 

    } else { 

//Fail or do other stuff 
} 
0

這裏有一個稍微醜陋伎倆對付這種事情:

讓實現接口的兩個類:

public interface DrawableUtil { 
    void setBackground(View v, Drawable d); 
} 

public class PreJellyBeanDrawableUtil { 
    void setBackground(View v, Drawable d) { 
     v.setBackgroundDrawable(d); 
    } 
} 
public class JellyBeanDrawableUtil { 
    void setBackground(View v, Drawable d) { 
     v.setBackground(d); 
    } 
} 

現在你可以使用通常的成語來構建相應的執行:

DrawableUtil util; 
if (Build.VERSION.SDK_INT >= 16) 
    util = new JellyBeanDrawableUtil(); 
else 
    util = new PreJellyBeanDrawableUtil(); 
util.setBackground(view, icon); 

這將不從的VerifyError問題的困擾,因爲它永遠不會用在新平臺上不推薦使用的方法加載類。

+0

是的,它需要另一個助手類,我試圖避免。 pff一些方法僅爲名稱而被棄用。 – xmen