내 애플리케이션에 여러 가지 액티비티와 "활동 시작"버튼 목록이 있습니다. 이를위한 사용자 정의보기를 만들었습니다. 클릭 핸들러와 전환 명령문을 처리 할 필요가 없도록 레이아웃의 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)가 작동합니까? –
Nope. 'instanceof'는 정적 검사를하므로 사용할 수 없습니다. 'Class >'는 컴파일시에 캐스팅 될 수 없습니다. – klenium