LINUX.ORG.RU
ФорумMobile

Изменить текст на TextVie на не активном табе(фрагменте)

 


0

2

У меня приложение с Navigation Drawer которое имеет 6 фрагментов. Первый фрагмент называется MainFragment. MainFragment в свою очередь имеет 4 фрагмента(таба). Они называются FragmentOne(COMMON), FragmentTwo(Battery), FragmentThree(Internal), FragmentFour(Internal).В MainActivity запускается AsyncTask(MyTask) который меняет текст в текущем фрагменте OneFragment(Common) и на не активном фрагменте ThirdFragment(Internal). Мой вопрос: этот AsyncTask не может изменить текст на TextView на этих табах(Common and Internal). Как это сделать? Что я делал: если сделать активным таб Common(FragmentOne) TabLayout.getTabAt(0).select() то изменение текста на TextView на Common(FragmentOne) работает. Если переключиться на третий таб Internal(FragmentThree) TabLayout.getTabAt(2).select() то срабатывает exception. Как изменить текст TextView на не активном фрагменте. Исходный код прилагается. Основные фрагменты: MainActivity MainFragment FragmentFirst FragmentSecond .... FragmentSix. Исходный код

https://yadi.sk/d/2IyWYe0f3J6Pmo

class MyTask extends AsyncTask<Void, Void, Integer> {

@Override protected Integer doInBackground(Void... params) { //Thread.currentThread().setPriority(Thread.MIN_PRIORITY); while (!isCancelled()) { try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } publishProgress(); } return null; }

@Override protected void onProgressUpdate(Void... values) { super.onProgressUpdate(values);

Log.d(TAG, «MainFragment do try»);

try { //tabLayout.getTabAt(0).select(); textV1.setText not work when tab(0) inactive

TextView textV1 = (TextView) findViewById(R.id.TextName2); textV1.setText(«InternalMemory»);

TextView textV2 = (TextView) findViewById(R.id.textParam6); textV2.setText(«All: »+bytesToHuman(getTotalInternalSpace()));

TextView textV3 = (TextView) findViewById(R.id.textParam7); textV3.setText(«Path: »+getInternalMemoryPath());

TextView textV4 = (TextView) findViewById(R.id.textParam9); textV4.setText(«Free: »+bytesToHuman(getAvailableInternalSpaceSize()));

int t4 = (int) Math.ceil(((getAvailableInternalSpaceSize()*100)/getTotalInternalSpace())); TextView textV5 = (TextView) findViewById(R.id.textParam8); textV5.setText(String.format(«%d »,t4) + «% »);

ProgressBar textV6 = (ProgressBar) findViewById(R.id.progressBar1); textV6.setProgress(t4); if (t4<=20) { textV6.getProgressDrawable().setColorFilter(Color.RED, PorterDuff.Mode.SRC_IN); } else if ((t4>20) && (t4<=40)){ textV6.getProgressDrawable().setColorFilter(Color.MAGENTA, PorterDuff.Mode.SRC_IN); } else if ((t4>40) && (t4<=60)){ textV6.getProgressDrawable().setColorFilter(Color.YELLOW, PorterDuff.Mode.SRC_IN); } else if ((t4>60) && (t4<=80)){ textV6.getProgressDrawable().setColorFilter(Color.BLUE, PorterDuff.Mode.SRC_IN); } else if ((t4>80) && (t4<=90)){ textV6.getProgressDrawable().setColorFilter(Color.GREEN, PorterDuff.Mode.SRC_IN); } else if ((t4>90) && (t4<=100)){ textV6.getProgressDrawable().setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN); } else textV6.getProgressDrawable().setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN); Log.d(TAG, «MainFragment do internalMemoryInfo»);

//tabLayout.getTabAt(2).select();ThreeFragment.showText not work when tab(2) inactive

ThreeFragment.showText(textV2.getText() + «\n» + textV3.getText() + «\n» + textV4.getText() + «\n» + «Percent: » + textV5.getText());

Log.d(TAG, «MainFragment posle internalMemoryInfo»);

} catch (Exception e) { Log.d(TAG, «MainFragment in Exception»); e.printStackTrace(); } } }

Ответ на: комментарий от Jefail

Ответ

Можно поподробнее. Я могу привести приложение с иллюстрацией жизненного цикла. Но это мне не дает ответ.

action555
() автор топика

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

Weres ★★★
()
Ответ на: комментарий от Weres

Я извиняюсь за то что сильно не понимаю пока андроид. Но Я пытаюсь все таки разобраться View понял что такое, а что такое модель. Пж если можно с примером

action555
() автор топика

Делаешь адаптер ViewPager вложенным в класс в MainFragment, из этого же фрагмента пускаешь свой AsyncTask (для чего он у тебя расположен в Activity, если нужен только в табах фрагмента непонятно). В адаптере ViewPager в методе Fragment getItem(int) перед созданием объекта фрагмента проверяешь есть ли данные в поле String, которое нужно отобразить в твои TextView, если они есть, то пакуешь их в Bundle и засовываешь в созданный объект фрагмента методом setArguments(Bundle). В своих фрагментах где-нибудь в onViewCreated() получаешь данные через getArguments() и проверяешь, есть ли в этом бандле нужные тебе данные, если есть, то отображаешь их в TextView этого фрагмента.

ertgblasd ★★
()
Ответ на: комментарий от action555

Это не особенности андроида, это архитектура приложений в принципе. Я бы вам посоветовал почитать статьи их интернета по запросу «android mvp example», а потом ещё и по «android mvp rxjava example». Если вы хотите профессионально заниматься разработкой под андроид, то вам эти знания и навыки сильно пригодятся и код ваш станет куда лучше. Эту задачу наверняка можно решить без MVP, но это просто грязный код, загаживающий приложение. В дальнейшем вам это аукнется при его поддержке.

Weres ★★★
()
Ответ на: комментарий от action555

Модель - это обычный Java класс, который представляет собой данные. View берет эти данные из модели и отображает их.

Jefail ★★★★
()
Ответ на: комментарий от Jefail

Всего то надо было перенести MyTask extends AsyncTask из MainActivity в MainFragment))) Спасибо всем. Вопрос закрыть.

action555
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.