ВОПРОС 1 - Что делает последняя функция? Мне кажется, что он вызывает метод onMessageRead (), но этот метод не содержит никакой активности в своем определении .
Последняя функция - это вызов метода onMessageRead (), который реализует ваш слушатель.
Вы объявили переменную с типом OnMessageReadListener, то есть она реализует метод onMessageRead (String message).
OnMessageReadListener messageReadListener;
....
public interface OnMessageReadListener{
public void onMessageRead(String message);
}
ВОПРОС 2 - Что делает весь метод onAttach? Я читаю такие вещи, как «Вызывается, когда фрагмент впервые присоединяется к его контексту», но я этого не понимаю. Каков здесь контекст?
Это несколько сбивает с толку, но сводится к жизненному циклу активности андроида .
Система Android вызывает несколько обратных вызовов, когдадействие переходит в новые состояния, чтобы позволить разработчикам действовать в соответствии с этими изменениями состояния.
В этом случае система Android вызывает метод OnAttach, когда фрагмент прикреплен к вашему действию.
Activity activity = (Activity) context;
try{
messageReadListener = (OnMessageReadListener) activity;
}catch (ClassCastException e){
throw new ClassCastException();
}
Как вы видите, здесь происходит то, что разработчик говорит Android: «когда вы присоединяете мой фрагмент к активности cointainer, присвойте переменной messageReadListener значение самой Activity, которая должна реализовывать интерфейс OnMessageReadListener, иначе будет выдано исключение ClassCastException».
ВОПРОС 3 - Я действительно не понимаю, когда этот последний метод onMessageRead () get вызывается здесь.
Он вызывается в вашем ВОПРОСЕ 1код.
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String message = editText.getText().toString();
messageReadListener.onMessageRead(message);
}
});
Итак, что здесь происходит?
Разработчик просто использует интерфейсы дляw этот фрагмент для отправки сообщения основной деятельности, когда вы нажимаете кнопку в вашем фрагменте.
Здесь вы говорите: «Я получил переменную, которая содержит все, что реализует интерфейс OnMessageReadListener».
Затем в основном действии вы реализуете этот интерфейс, создав метод onMessageRead ().
Когда Adroid присоединяет фрагмент к основному действию, вы назначаете это действие переменной вашего Фрагмента messageReadListener , ввызов OnAttach.
И после этого вы просто используете эту переменную для вызова при событии кнопки OnClik метода onMessageRead () в основном действии.
Это разрешает ваш фрагмент иосновная деятельность по соединению распутанный , то есть без удержания одного, ссылки на другое.
РЕДАКТИРОВАТЬ: ВОПРОС 4 Я все еще думаю, что у меня естьгде-то ошибка, потому что почему бы мне просто не написать это MainActivity.onMessageRead (message);немедленно? И почему бы мне просто не определить метод onMessageRead () непосредственно в MainActivity и получить лишние интерфейсы во фрагменте?
Вы можете сделать это, но это будет означать, что эти классы получат запутался . То есть вам нужна ссылка на MainActivity в вашем фрагменте.
С помощью интерфейса вы можете использовать свой фрагмент для ANY активности. Он нужен вам только для реализации интерфейса, при любом новом действии, чтобы использовать его.
Так что вам будет проще повторно использовать ваш код, и будет намного понятнее реализовать этот интерфейс в любом действии, которое вы хотите, чтобы ваш фрагмент былчем получить экземпляр каждого действия, в котором вы хотите использовать свой фрагмент, и выяснить, что является вызывающим.
Кодирование интерфейсов считается хорошей практикой дляОбъектно-ориентированное программирование.