2017-10-28 82 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)) 

假设它是安全的实例化对象此项检查。