2013-05-02 3 views
0

У меня есть несколько фрагментов в одном действии, которые должны иметь возможность передавать данные между ними. Я использовал учебники для реализации обратных вызовов. My MainActivity - это внешний класс, в котором мои классы фрагментов. Кроме того, у меня есть FragmentPagerAdapter, который обрабатывает переходы фрагментов. Ну, дело в том, что Eclipse не позволит мне реализовать мой интерфейс обратного вызова, который включен в один из фрагментов, для моего внешнего класса MainActivity.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 или что-то там. Если, однако, ConnectionFragment скомпилирован в свой собственный файл (ConnectionFragment.cass), то MainActivity.class может зависеть от него, и Eclipse автоматически обрабатывает порядок сборки.

+0

Спасибо! Это сработало. Но, к сожалению, у моего приложения все еще есть проблемы с отправкой данных из одного фрагмента в другой. Но это, как предполагается, еще один вопрос, который я предполагаю – timolemow

-1

Кажется, что вы не можете использовать интерфейс, прежде чем объявлять его.

0

Фрагменты должны никогда не взаимодействуют друг с другом, так как это создает нежелательную связь.

Ваш фрагмент должен вызывать метод интерфейса, реализованный Activity для связи с Activity, тогда Activity может связывать/ретранслировать это взаимодействие с другим фрагментом.

Смежные вопросы