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 может сообщать / ретранслировать это взаимодействие с другим фрагментом.
Кажется, что вы не можете использовать интерфейс, прежде чем объявить его.