私のアプリケーションにはいくつかのアクティビティと「アクティビティの開始」ボタンのリストがあります。私はこのためのカスタムビューを作成しました。クリックハンドラと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
があります。私は考えていない、何が間違っている?
'ClassA instanceof ClassB' –
if(check instanceof Activity)は動作しますか? –
'instanceof'は静的なチェックをしますので、使用できません。 'Class >'はコンパイル時にキャストできません。 – klenium