2017-10-28 90 views
1

我的應用程序有幾個活動,以及「開始活動」按鈕列表。我爲此創建了一個自定義視圖。爲了不需要處理點擊處理程序和切換語句,我可以在佈局的XML文件中設置custom:start_activity=".OtherActivity"屬性。檢查動態創建的類是否爲活動

當然,很好的計劃。但我必須爲此提供錯誤檢測。 start_activity中的鍵入的字符串必須是有效的類名,並且該類必須是Activity的子項。 OtherActivityAppCompatActivity的子類的類的子類。

這是我已經試過:

String name = array.getString(R.styleable.MyView_start_activity); 
if (name == null) 
    throw new IllegalArgumentException("name attribute must be set."); 
final String className = context.getPackageName() + activity; 
try { 
    Class<?> check = Class.forName(className); //, false, getClass().getClassLoader()); // create only at click later 
    if (!Activity.class.isInstance(check)) 
     throw new IllegalArgumentException(className + " is not a valid activity."); 
} catch (ClassNotFoundException e) { 
    throw new IllegalArgumentException(className + " is not a valid class."); 
} 

然而,isInstance總是返回false,所以它拋出異常的所有時間。我也試過isAssignableFrom,以及不同的參數/類變體。給定的字符串是一個有效的類,不會拋出ClassNotFoundException,並且在調試器中,我可以在check的超類樹中看到Activity。我不知道,我做錯了什麼?

+3

'ClassA instanceof ClassB' –

+0

會使用if(check instanceof Activity)嗎? –

+0

沒有。 'instanceof'做了一個靜態檢查,所以我不能使用它。 '類'不能在編譯時被鑄造。 – klenium

回答

0

isInstance()和instanceOf將不起作用,除非檢查被實例化/是一個對象。

你可以做

if (!Activity.class.isInstance(check.newInstance())) 

if (!(check.newInstance() instanceof Activity)) 

假設它是安全的實例化對象此項檢查。