Я передаю данные через активность во фрагмент, используя Bundle, Bundle получает значение из счетчика, Counter обновляет свою базу значений в Thread.
Мне удалось получить данные во фрагменте, но пользовательский интерфейс фрагмента обновляется только при транзакции фрагмента, поэтому возникает вопрос
how can i update fragment Ui at Real time
Код следующим образом:
int i=0;
Sbundle = new Bundle();
thread = new Thread() {
@Override
public void run() {
try {
while (!thread.isInterrupted()) {
Thread.sleep(1000);
runOnUiThread(new Runnable() {
@Override
public void run() {
i++;
Sbundle.putString("speed", String.valueOf(i) );
}
});
}
} catch (InterruptedException e) {
}
}
};
thread.start();
}
Фрагмент транзакции по клику:
public void onClick(View v) {
speedFragment = new SpeedFragment();
speedFragment.setArguments(Sbundle);
RoboActivity activity = MainActivity.this;
if (!isFinishing() && !isDestroyed()) {
FragmentTransaction ft = activity.getFragmentManager()
.beginTransaction();
ft.replace(R.id.fragment_container, speedFragment);
ft.detach(speedFragment).attach(speedFragment).commit();
}
}
со стороны фрагмента:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle bundle = this.getArguments();
mySpeed = bundle.getString("speed");
}
вам нужно создать интерфейс и обновить значение textview от действия до фрагмента этим интерфейсом
Теджас, короче говоря, ты хочешь, чтобы я передал данные через интерфейс??
Какие компоненты пользовательского интерфейса есть у вашего фрагмента?
если у вас есть, например, TextView, просто используйте yourTextView.setText(mySpeed)
конечно, вам нужно привязать textView до того, как вы onCreate() во фрагменте.
Также помните, что если вы хотите обновить элементы пользовательского интерфейса после того, как вы были в другом потоке, вы должны вызвать getActivity().runOnUiTnread(new Runnable(){....})
пример:
private void toggleLoadingIndicator(boolean toShow) {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
loadingIndicator.setVisibility((toShow ? View.VISIBLE : View.INVISIBLE));
}
});
}
вы можете использовать ту же технику для TextView.setText()
можете ли вы прислать мне любой пример, который включает использование "getActivity().runOnUiTnread(new Runnable(){....})" , это было бы полезно
Не работает, потому что компонент пользовательского интерфейса обновляется в транзакции фрагмента, я пробовал рекурсивную транзакцию, но сбой приложения
Где происходит код с Thread.sleep? в действии или фрагменте?
в действии, но я создаю отдельный поток во фрагменте (как вы упоминаете)
если вы думаете, что значение, которое вы помещаете в пакет, будет обновляться во фрагменте каждый раз, когда вы обновляете его в действии, это неверно.
я отредактировал код, если вы хотите что-то большее, например вывод и т. д., спросите меня
Вы можете напрямую обновить метод attach и detach, как показано ниже.
FragmentTransaction ft = ((AppCompatActivity) context).getSupportFragmentManager().beginTransaction();
ft.detach(f).attach(f).commit();
какие изменения я должен внести в метод присоединения и отсоединения в классе фрагмента? можешь помочь мне более конкретно
сделайте это в своей функции запуска потока. Поместите этот код в метод запуска.
не работает, тот же результат, что и раньше. Я понял логику вашего кода и технически это должно работать, но я не получил результата. Спасибо за поддержку.
это будет работать. Вы хотите получить доступ к значению i, используя метод получения активности.
Предлагаю использовать
LiveDataиDataBindingотJetpackОбратитесь к этому