Android: реализовать внутренний класс во внешнем классе; обратный вызов из внутреннего класса и внешнего класса

У меня есть несколько фрагментов в одном действии, которые должны иметь возможность передавать данные между ними. Я использовал учебники для реализации обратных вызовов. Моя MainActivity - это внешний класс, в котором находятся мои классы фрагментов. Кроме того, у меня есть FragmentPagerAdapter, который обрабатывает переходы фрагмента. Дело в том, что Eclipse не позволит мне реализовать мой интерфейс обратного вызова, включенный в один из фрагментов, для моего внешнего класса MainActivity.

Это структура моего кода:

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 автоматически обработает порядок сборки.

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

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

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

Другие вопросы по тегам