Первое, что я должен позаботиться о том, чтобы при создании фрагмента мы могли получить ошибку нулевого указателя.Таким образом, я прикрепил фрагмент внутри activity_main в onCreate в MainActivity.
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Frag1 fragment = new Frag1();
fragmentTransaction.replace(R.id.ll, fragment);
fragmentTransaction.commit();
Далее я запускаю поток после этого, используя метод нажатия кнопки.
public void run(View view){
t = new Thread(this, "Demo Thread");
System.out.println("Child thread: " + t);
t.start(); // Start the thread
}
Если я включу три вышеупомянутых строкивнутри onCreate после транзакции фрагмента я получаю ошибку нулевого указателя.Далее следует сложная часть: поток будет генерировать новые значения с течением времени, но остальная часть кода уже запущена.Вот почему вы получаете ноль (начальное значение).Это может быть решено технически (насколько мне известно) либо путем создания намерения, либо путем создания прослушивателя.Я пытался использовать Intent, к сожалению, пока Intent переходит от Fragment к MainActivity (или к любому другому действию), я не мог сделать это от Activity к фрагменту (возможно, что-то по-прежнему отсутствует).Поэтому я использовал Listener.Теперь нет готового слушателя, мы должны его создать.Более хитроумно, как это использовать.Я создал для этого интерфейс OnFragmentInteractionListener.java.
interface OnFragmentInteractionListener {
void onFragmentInteraction(int i);}
Теперь внутри Fragment я хочу отобразить это в TextView.Для этого я бы создал представления внутри метода onStart () (в противном случае я получаю ошибку нулевого указателя :-).И я создам интерфейс внутри него.
Activity context;
TextView tv;
static OnFragmentInteractionListener onFragmentInteractionListener;
@Override
public void onStart() {
super.onStart();
context = getActivity();
tv = context.findViewById(R.id.output) ;
onFragmentInteractionListener = new OnFragmentInteractionListener() {
@Override
public void onFragmentInteraction(int i) {
tv.setText(" OUT "+i);
}
};
}
Далее вернемся к MainActivity.
@Override
public void run() {
try {
for(int i = 20; i > 0; i--) {
System.out.println("Child Thread: " + i);
Frag1.onFragmentInteractionListener.onFragmentInteraction(i);
Thread.sleep(2000);
}
} catch (InterruptedException e) {
System.out.println("Child interrupted.");
}
System.out.println("Exiting child thread.");
}
Если вы запустите код, вы получите вывод, как вы хотели.