Как обновить или обновить интерфейс фрагмента

Я передаю данные через активность во фрагмент, используя 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");

        }

Предлагаю использовать LiveData и DataBinding от JetpackОбратитесь к этому

Aseem Sharma 28.01.2019 08:24

вам нужно создать интерфейс и обновить значение textview от действия до фрагмента этим интерфейсом

Tejas Pandya 28.01.2019 08:36

Теджас, короче говоря, ты хочешь, чтобы я передал данные через интерфейс??

Harsh ramani 28.01.2019 08:38
1
3
1 872
2

Ответы 2

Какие компоненты пользовательского интерфейса есть у вашего фрагмента? если у вас есть, например, 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(){....})" , это было бы полезно

Harsh ramani 28.01.2019 09:44

Не работает, потому что компонент пользовательского интерфейса обновляется в транзакции фрагмента, я пробовал рекурсивную транзакцию, но сбой приложения

Harsh ramani 28.01.2019 10:25

Где происходит код с Thread.sleep? в действии или фрагменте?

Maksim Novikov 28.01.2019 10:30

в действии, но я создаю отдельный поток во фрагменте (как вы упоминаете)

Harsh ramani 28.01.2019 10:49

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

Maksim Novikov 28.01.2019 11:19

я отредактировал код, если вы хотите что-то большее, например вывод и т. д., спросите меня

Harsh ramani 28.01.2019 11:33

Вы можете напрямую обновить метод attach и detach, как показано ниже.

FragmentTransaction ft = ((AppCompatActivity) context).getSupportFragmentManager().beginTransaction();
ft.detach(f).attach(f).commit();

какие изменения я должен внести в метод присоединения и отсоединения в классе фрагмента? можешь помочь мне более конкретно

Harsh ramani 28.01.2019 09:15

сделайте это в своей функции запуска потока. Поместите этот код в метод запуска.

sushildlh 28.01.2019 09:18

не работает, тот же результат, что и раньше. Я понял логику вашего кода и технически это должно работать, но я не получил результата. Спасибо за поддержку.

Harsh ramani 28.01.2019 09:42

это будет работать. Вы хотите получить доступ к значению i, используя метод получения активности.

sushildlh 28.01.2019 10:34

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