2017-10-28 14 views
1

私のアプリケーションにはいくつかのアクティビティと「アクティビティの開始」ボタンのリストがあります。私はこのためのカスタムビューを作成しました。クリックハンドラとswitch文を処理する必要がないように、レイアウトのXMLファイルにcustom:start_activity=".OtherActivity"属性を設定できます。動的に作成されたクラスがアクティビティであることを確認してください

確かに素晴らしい計画です。しかし、私はそのためのエラー検出を提供する必要があります。 start_activityの型指定された文字列は有効なクラス名でなければならず、そのクラスはActivityの子でなければなりません。 OtherActivityは、AppCompatActivityのサブクラスであるクラスのサブクラスです。

これは私が試したものです:

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'は静的なチェックをしますので、使用できません。 'Class 'はコンパイル時にキャストできません。 – klenium

答えて

0

isInstance()チェックがインスタンス化されていないか/オブジェクトでない限り、instanceOfは機能しません。

あなたはこのチェックのために、あなたのオブジェクトをインスタンス化しても安全であると仮定すると、

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

または

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

を行うことができます。

関連する問題