2017-10-28 1 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

Nope. 'instanceof'는 정적 검사를하므로 사용할 수 없습니다. 'Class '는 컴파일시에 캐스팅 될 수 없습니다. – klenium

답변

0

isInstance()이며 인스턴스가 확인되지 않는 한 instanceOf가 작동하지 않습니다/개체입니다.

당신은이 검사를 위해 개체를 인스턴스화하는 것이 안전합니다 가정

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

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

또는

을 할 수 있습니다.

관련 문제