2013-05-02 4 views
0

하나의 액티비티에 데이터를 전달할 수 있어야하는 여러 조각이 있습니다. 튜토리얼을 사용하여 콜백을 구현했습니다. 내 MainActivity는 내 조각 클래스가있는 외부 클래스입니다. 또한 조각 전이를 처리하는 FragmentPagerAdapter가 있습니다. 사실, Eclipse는 내 MainActivity 외부 클래스에 대해 Fragments 중 하나에 포함되어있는 콜백 인터페이스를 구현하지 않습니다. Android : 외부 클래스에 내부 클래스를 구현합니다. 내부 클래스와 외부 클래스의 콜백

내 코드의 구조 :

public class MainActivity extends FragmentActivity **implements ConnectionFragment.dataCallback**{ 
//compiler error here:"ConnectionFragment cannot be resolved to a type" 
//when i leave this out i get runtime error: "MainActivity java must 
//implement dataCallback" 

... 

    public class SectionsPagerAdapter extends FragmentPagerAdapter implements ConnectionFragment.dataCallback{ 
     @Override 
     public void updateLog(View v, String line) { 
      DataFragment dataFrag = (DataFragment)getSupportFragmentManager().findFragmentByTag(DataFragment.class.getName()); 
       if (dataFrag != null){ 
        dataFrag.updateLog(v,line); 
       } 
     } 
    ... 

    } 
    public static class ConnectionFragment extends Fragment { 
    ... 
     public interface dataCallback{ 
     public void updateLog(View v, String line); 
     } 
     dataCallback mCallback; 
     private static dataCallback dummyCallback=new dataCallback(){ 
      @Override 
      public void updateLog(View v, String line){  
      } 
     }; 

     @Override 
     public void onAttach(Activity activity){ 
      super.onAttach(activity); 
      try { 
       mCallback = (dataCallback)activity; 
      } catch (ClassCastException e){ 
      throw new ClassCastException(activity.toString() + " must implement dataCallback"); 
     } 
    } 
    } 
    public static class DataFragment extends Fragment implements ConnectionFragment.dataCallback{ 
     public void updateLog(View v,String line){ 

      TextView logTextView=(TextView)v.findViewById(R.id.log_view); 
      logTextView.append("\n"+line); 
    } 

    ... 
    } 
    public static class GraphFragment extends Fragment { 
    ... 
    } 
} 

ConnectionFragment가 DataFragment로 데이터를 전송 할 수 있어야한다.

감사합니다.

답변

3

내부 인터페이스를 구현하거나 내부 클래스를 확장 할 수 없습니다. ConnectionFragment을 자체 파일로 이동하기 만하면됩니다.

이것은 컴파일 타임에 이러한 내부 클래스가 부모 클래스에 종속되어 있기 때문에 발생합니다. 컴파일 된 .class 파일을 보면, 내부 객체는 MainActivity$ConnectionFragment.class 또는 theres abouts로 컴파일됩니다. 그러나 ConnectionFragment이 자체 파일 (ConnectionFragment.cass)로 컴파일 된 경우 MainActivity.class이 종속 될 수 있으며 Eclipse는 자동으로 빌드 순서를 처리합니다.

+0

감사합니다. 그것은 효과가 있었다. 하지만 불행히도 내 애플 리케이션은 여전히 ​​한 조각에서 다른 곳으로 데이터를 전송하는 데 문제가 있습니다. 그러나 이것은 내가 추측하는 또 다른 질문이 될 것으로 예상됩니다. – timolemow

-1

선언하기 전에 인터페이스를 사용할 수없는 것 같습니다.

0

단편 은 원하지 않는 결합을 생성하기 때문에 서로 직접 상호 작용해야합니다.

당신의 프래그먼트는 액티비티에 의해 구현 된 인터페이스 메소드를 호출해야 액티비티와 통신 할 수 있습니다. 그런 다음 액티비티는 다른 프래그먼트와의 상호 작용을주고받습니다.