2012-08-30 4 views
3

안드로이드 설명서 여기 : http://developer.android.com/guide/components/fragments.html 조각 인터페이스를 구현합니다.Android 활동을 인터페이스에 전송하는 방법은 무엇입니까?

onAttach() 콜백에서 현재 활동을 인터페이스로 캐스팅 한 것처럼 보입니다. 개념적으로 이것이 가능한 방법은 무엇이며 바닐라 자바에서 캐스트 표준 연습과 동일한 유형입니까? 활동 또는 기본 클래스 중 하나가 인터페이스를 구현로서 선언되어있는 경우

public static class FragmentA extends ListFragment { 


// Container Activity must implement this interface 
    public interface OnArticleSelectedListener { 
     public void onArticleSelected(Uri articleUri); 


    OnArticleSelectedListener mListener; 



    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     try { 
      mListener = (OnArticleSelectedListener) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener"); 
     } 
    } 
    ... 
} 

답변

7

주제에 대한 몇 가지 기본 지식 :

이 기능의 번들로 interface 생각해보십시오. classinterface을 구현하면 모든 인터페이스 기능이 구현됨을 보장합니다. 귀하의 경우에는

:

객체를 가지고 있고 당신이 당신의 객체가 구현, 당신은 치료 (주조) 할 수있는, 인터페이스의 기능 이상이 필요하지 않은 경우 해당 인터페이스에 해당 객체. 이렇게하면 인터페이스 함수를 제외한 해당 함수를 사용할 수 없기 때문에 객체에 대한 "정보"가 느슨해 지지만 때로는 충분할 수도 있습니다.

3

, 인터페이스로 캐스팅 물론 가능하다.

이것은 바닐라 자바의 표준 사례입니다.

onattach가 호출되는 값을 절대적으로 확신하지 못하면 인스턴스를 수행하기 전에 instanceof를 사용하여 테스트해야합니다.

3

일부 인터페이스를 구현하는 클래스에서 생성 된 모든 객체는 해당 인터페이스의 인스턴스이기도합니다. 다음이 인쇄되어,이 경우

public class Main { 
    public static void main(String[] args) { 
     MyClass mine = new MyClass(); 
     checkIsFoo(mine); 
    } 

    public static void checkIsFoo(MyClass mine) { 
     System.out.print(mine+""); 
     if (mine instanceof MyFoo) 
      System.out.println(" is Foo!"); 
     else 
      System.out.println(" is not Foo!"); 
    } 
    public static interface MyFoo { 
     // 
    } 
    public static class MyClass implements MyFoo { 
     // 
    } 
} 

:

이 고려 [email protected] is Foo!. 이는 MyClass 개체가 MyFoo의 인스턴스이기도 함을 나타냅니다. 공유 인스턴스이므로 (MyFoo) mine에 대한 캐스트 호출도 허용됩니다.

이것은 @antlersoft가 말했듯이 바닐라 자바의 일부입니다 (그리고 here에서 볼 수 있습니다).

이 경우, onAttach에 전달 된 Activity항상이 모두 ActivityOnArticleSelectedListenerOnArticleSelectedListener에 캐스팅하는 것은 항상 성공해야되는 대상이되어야하기 때문에

.

관련 문제