Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
#1

Изменить из активити данные в фрагменте - Android

15.10.2014, 15:33. Просмотров 1182. Ответов 8
Метки нет (Все метки)

Есть Activity с PagerAdapter, в который грузятся фрагменты.
В классе фрагмента данные берутся из БД и грузятся в ListView через адаптер (extends SimpleCursorAdapter).
Как из метода в Activity изменить TextView в текущем фрагменте?
Пробую с помощью FragmentManager fm = getSupportFragmentManager(), но застрял...
Теги тоже присваиваю в адаптере через view.setTag, а в активити как их взять?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.10.2014, 15:33     Изменить из активити данные в фрагменте
Посмотрите здесь:

Android Как изменить заголовок вкалдки при изменении контента активити
сохранить данные в фрагменте и после их вернуть Android
Как правильно обновить данные для списка при изменении данных в другом фрагменте? Android
Android Изменить расположение View элементов в активити из кода
Android Другой кнопкой из дочерней активности изменить фон той кнопки, которая в родительской активити
Android Не передаются данные между активити
Сохранение данные при переходе на другой активити Android
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
YuraAAA
1564 / 1306 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
15.10.2014, 16:07     Изменить из активити данные в фрагменте #2
Rube, можно через Broadcast Receiver, можно через какой-нибудь менеджер. Например,

1. Interface

Java
1
2
3
4
public interface OnChangeListener {
        
        void onChange(String data);
    }
2. Manager

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class ChangeManager {
        private static ChangeManager instance;
        private OnChangeListener listener;
 
        public static ChangeManager getInstance() {
            if (instance == null) {
                instance = new ChangeManager();
            }
            return instance;
        }
 
        private ChangeManager() {}
 
        public void setListener(OnChangeListener listener) {
            this.listener = listener;
        }
 
        public void notifyOnChange(String data) {
            if (listener != null) {
                listener.onChange(data);
            }
        }
 
 
    }
3. Во фрагменте, например, в onResume пишем

Java
1
2
3
4
5
6
7
8
ChageManager.getInstance().setListener(new OnChangeListener() {
 
@Override
void onChange(String data) {
//Set to textview
}
 
});
4. В активити

Java
1
ChangeManager.getInstance().notifyOnChange("Hellooo");
ну такой примитивный пример

Добавлено через 34 секунды
Писал на коленке, так что мог опечататься
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
15.10.2014, 19:31  [ТС]     Изменить из активити данные в фрагменте #3
Не совсем примитивный для меня) А попроще никак нельзя? Через теги например, ведь каждому item в ListView присваивается тег, а вот как его получить в активити?
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,723
15.10.2014, 22:42     Изменить из активити данные в фрагменте #4
Rube, недавно решал похожую задачу. В MainActivity в верхней панели есть ActionBar с поиском, туда можно вводить символы, а сам поиск осуществляется во фрагментах. Пришлось помучаться, кое-что нашёл на stackoverflow, а окончательно понял, как сделать, прочитав часть статьи http://startandroid.ru/ru/uroki/vse-...vie-s-activity под заголовком "Обработка в Activity события из фрагмента" (ближе к концу статьи). Правда, там описан противоположный пример, но нетрудно переделать его в вызов метода фрагмента по событию из MainActivity.
Также может помочь статья https://github.com/thecodepath/andro...sing-Fragments, читать удобнее с "Fragment Listener". В обоих случаях используются "интерфейсы". В interface вы можете объявить один или несколько методов (можно с параметрами).

Добавлено через 5 минут
Да, некоторые авторы присоединяют (отсоединяют) listener'ы ("слушатели" или как их там) в onAttach (onDetach), другие - в onStart (onStop). Методом научного тыка я понял, что лучше всего подходят onCreateView (onDestroyView). В этом случае при переключении фрагментов и при запуске из фрагмента другой activity происходит последовательное включение и отключение listener'ов. Об этом - в моём будущем тьюториале на этом сайте.
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
16.10.2014, 11:22  [ТС]     Изменить из активити данные в фрагменте #5
Нашел вот что:
Java
1
2
3
View v = (View) pager.getFocusedChild(); // получить тек. вьюшку                
TextView tv = ((TextView) v.findViewById(R.id.textNew)); // получить поле TextView  
tv.setText("ля-ля-тополя");
Все прекрасно работает, но только для первого item в ListView.
А как перебрать все итемы и изменить текст напр. во втором?
Spelcrawler
523 / 493 / 111
Регистрация: 12.03.2014
Сообщений: 1,646
Завершенные тесты: 1
16.10.2014, 12:29     Изменить из активити данные в фрагменте #6
Java
1
pager. getChildAt(position)
Должно сработать)

Добавлено через 4 минуты
Ааааа, не так понял. Нужно найти не текстВью, а листВью и у него получить адаптер ну и у адаптера сделать метод на смену текста итема и его ввызвать. Как то так)
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
16.10.2014, 13:10  [ТС]     Изменить из активити данные в фрагменте #7
Spelcrawler, да, я сначала использовал getChildAt(position), но он криво работал если пролистнуть туда-сюда страницы. А getFocusedChild() работает корректно.
Напомню, мне нужно изменить элемент (TextView) на текущей странице, причем он изначально не заполняется через адаптер (курсор), т.е. его нет в адаптере.
Вот ListView то нашел ListView lv = (ListView) v.findViewById(R.id.listView1);, и getCount() нашел, все верно.
Теперь надо изменить вторую строчку в ListView, т.к. setText() меняет первую, что логично.
Пока ловлю теги, присвоенные в адаптере, но не ловятся) Через какую View их ловить? В адаптере я так понимаю они присваиваются самой fragment_item.xml?
Spelcrawler
523 / 493 / 111
Регистрация: 12.03.2014
Сообщений: 1,646
Завершенные тесты: 1
16.10.2014, 13:14     Изменить из активити данные в фрагменте #8
Может
Java
1
2
3
4
5
for(int i = 0; i < lv.getCount(); i++){
 
lv.getChildAt(i).setText("text");
 
}
?
А лучше бы с адаптером все таки - удобнее было бы.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.10.2014, 14:17     Изменить из активити данные в фрагменте
Еще ссылки по теме:

Как передавать динамические данные (координаты GPS) из активити в диалог? Android
Вывод во втором фрагменте длины текста, введённого в первом фрагменте активити Android
Передать данные из fragment в активити Android
Android Изменить элемент одной активити из другой
Передать данные в активити Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
16.10.2014, 14:17  [ТС]     Изменить из активити данные в фрагменте #9
Цитата Сообщение от Spelcrawler Посмотреть сообщение
Может
Не работает, изменяется только первый итем.
Java
1
2
3
4
5
6
7
View v = (View) pager.getFocusedChild();                
ListView lv = (ListView) v.findViewById(R.id.listView1);                
for(int i = 0; i < lv.getCount(); i++){                  
    lv.getChildAt(i);
    TextView tv = (TextView) lv.findViewById(R.id.textNew); 
    tv.setText("text" + i); // TextView в первой строке становится text6
}
С адаптером у меня работало ранее, когда использовал ArrayAdapter, а теперича у меня CursorAdapter, тем более изменяемого поля в нем нет.

Добавлено через 16 минут
Хотя насчет поля я погорячился, оно там есть.

Добавлено через 15 минут
Ура, всем спс!
Проставил теги (позиция курсора) в адаптере в bindView.
Java
1
TextView.class.cast(view.findViewById(R.id.textNew)).setTag(pos);
В активити:
Java
1
2
3
4
View view = (View) pager.getFocusedChild(); // получить текущий вью         
ListView listview = (ListView) view.findViewById(R.id.listView1); // получить из вью ListView   
TextView textview = (TextView) listview.findViewWithTag(2); // получаем TextView с тегом "2"
textview.setText("ля-ля-тополя"); // меняем текст в 3-й строке
Будем знать теперь про теги) полезная вещица)
Yandex
Объявления
16.10.2014, 14:17     Изменить из активити данные в фрагменте
Ответ Создать тему
Опции темы

Текущее время: 18:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru