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

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

Войти
Регистрация
Восстановить пароль
 
MrArty
0 / 0 / 0
Регистрация: 27.01.2016
Сообщений: 32
#1

Обращение к элементам фрагмента из активити - Программирование Android

12.10.2016, 02:08. Просмотров 346. Ответов 9
Метки нет (Все метки)

Есть необходимость в программе менять значение TextView находящегося во фрагменте.

Фрагмент должен выводится в контейнер. И затем я должен найти элементы и изменить их. Если делать через динамический контейнер, то ничего не получается, элементы не обнаруживаются.

Java
1
2
3
4
5
    <FrameLayout
        android:layout_width="match_parent"
        android:orientation="vertical"
        android:layout_height="match_parent"
        android:id="@+id/fragCont"/>
А если делать вот так, то элементы успешно обнаруживаются, но как я понимаю, данный способ подходит только для статических объектов, так как если помещать в такой контейнер, то я потом не могу менять фрагменты в контейнере

Java
1
2
3
4
5
6
7
8
<fragment
    android:id="@+id/fragCont"
    android:name="com.leonov.smartdiagfrag.Fragment1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1"
    tools:layout="@layout/fragment1">
</fragment>
Фрагмент кода из main.class. Работает только со статичным контйнером.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    private void initFrag1() {
        TextView textBtrInfo = (TextView) findViewById(R.id.textBtrInfo);
        TextView textChrgInfo = (TextView) findViewById(R.id.textChrgInfo);
 
        frag1 = new Fragment1();
        fTrans = fManager.beginTransaction();
        fTrans.add(R.id.fragCont, frag1);
        fTrans.commit();
 
        textBatteryInfo = (TextView) findViewById(R.id.textBatteryInfo); //перестает работать с frame layot (null)
        textBatteryTemperature = (TextView) findViewById(R.id.textBatteryTemperature);//перестает работать с frame layot (null)
        textBatteryInfo.setText("Заряд батареи");
        textBatteryTemperature.setText("Температура батареи");
        textBtrInfo.setText(" " + getBatteryTemperatute(this).toString());
        textChrgInfo.setText(" " + getBatteryLevel(this).toString());
  }

Поясните новичку, уже два дня курю тему по фрагментам, никак не могу понять.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.10.2016, 02:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обращение к элементам фрагмента из активити (Программирование Android):

Обращение к элементам другой Активити - Программирование Android
Есть xml-файл главной активити main.xml который содержит поле ввода &lt;EditText android:id=&quot;@+id/edPhone&quot; ...

Обращение к элементам активити из другого класса - Программирование Android
Добрый день. Ломаю голову битый час, все не могу понять, почему у меня не получается. Опишу по шагам. Создал проект андроид (в эклипсе),...

Обращение к View элементам фрагмента - Программирование Android
Добрый день. Нужна помощь, уже не знаю что делать. Имеется три идентичных фрагмента с одним TextView (id = textview1). Имеется...

Активити отрабатывает быстрее фрагмента - Программирование Android
Непонятно поведение фрагмента (FragmentPagerAdapter). Вызываю активити из уведомления, из onCreate вызываю метод meUpdate, где хочу...

Как нажать кнопку основого активити из фрагмента - Программирование Android
Здравствуйте! Столкнулся с такой проблемой, что получается в фрагменте добраться до кнопки, которая в разметке самого фрагмента. Но...

Как открыть активити с фрагмента используя кнопку? - Программирование Android
У меня есть tab activity в ней есть фрагменты, так же есть второе tab activity и мне нужно с фрагмента из первого активити перейти во...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
fraley
105 / 105 / 38
Регистрация: 24.05.2015
Сообщений: 317
12.10.2016, 08:05 #2
https://www.youtube.com/watch?v=DsVAP2F9c1U
MrArty
0 / 0 / 0
Регистрация: 27.01.2016
Сообщений: 32
12.10.2016, 12:11  [ТС] #3
Смотрел уже, и урок от Девколибри. Не срабатывает.
Pablito
2473 / 1918 / 595
Регистрация: 12.05.2014
Сообщений: 6,742
Завершенные тесты: 1
12.10.2016, 12:19 #4
по-хорошему надо вызывать какой-нибудь метод на своем фрагменте и передавать туда строку или что там
а фрагмент уже сам должен решать куда и как отобразить эту строку

в методе фрагмента уже надо брать текствью и писать туда строку
MrArty
0 / 0 / 0
Регистрация: 27.01.2016
Сообщений: 32
12.10.2016, 12:43  [ТС] #5
Просто я решил это реализовать так, не знаю правильно или нет.
У меня есть главный MainActivity, и 3 фрагмента Fragment1, Fragment2, Fragment3.

Весь код будет выполняться в MainActivity c передачей данных во фрагмент. Так же не понимаю как корректно заставить Фрагмент1(так как он по умолчанию главный) сразу загружаться при старте системы. Видимо через транзакцию и вызов комит? Остальные фрагменты должны инициализироваться каждый раз при вызове их пункта меню из NavigationView.

Т.е. код такой
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
   protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
        /*Начало родного кода*/
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
 
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.setDrawerListener(toggle);
        toggle.syncState();
 
        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        View navHeaderMain = navigationView.inflateHeaderView(R.layout.nav_header_main);
        drawerItemModel = (TextView) navHeaderMain.findViewById(R.id.drawerHdrItemModel);
        tvHeaderModel = (TextView) navHeaderMain.findViewById(R.id.tvHeaderModel);
        tvHeaderPO = (TextView) navHeaderMain.findViewById(R.id.tvHeaderPO);
        tvHeaderOnline = (TextView) navHeaderMain.findViewById(R.id.tvHeaderOnline);
        navigationView.setNavigationItemSelectedListener(this);
         /*Конец родного кода*/
 
         /*Начало моего кода*/
        mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        mProximity = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
        initSensList();
        fManager = getSupportFragmentManager();
        initFrag1(); //пытаюсь вызвать фрагмент при старте системы, верно?
 /*Конец моего кода*/
    }
 
 
    public boolean onNavigationItemSelected(MenuItem item) {
 
        int id = item.getItemId();
 
        if (id == R.id.nav_diag) {
            initFrag2();
            fTrans.replace(R.id.fragCont, frag2);
            fTrans.commit();
        } else if (id == R.id.nav_mTouch) {
 
        } else if (id == R.id.nav_slideshow) {
 
        } else if (id == R.id.nav_manage) {
 
        } else if (id == R.id.nav_share) {
 
        } else if (id == R.id.nav_send) {
 
        } else if (id == R.id.nav_main){
            initFrag1();
            fTrans.replace(R.id.fragCont, frag1);
            fTrans.commit();
        }
 
 
    private void initFrag1() {
        TextView textBtrInfo = (TextView) findViewById(R.id.textBtrInfo);
        TextView textChrgInfo = (TextView) findViewById(R.id.textChrgInfo);
 
        frag1 = new Fragment1();
        fTrans = fManager.beginTransaction();
        fTrans.add(R.id.fragCont, frag1);
        fTrans.commit();
 
        textBatteryInfo = (TextView) findViewById(R.id.textBatteryInfo);
        textBatteryTemperature = (TextView) findViewById(R.id.textBatteryTemperature);
        textBatteryInfo.setText("Заряд батареи");
        textBatteryTemperature.setText("Температура батареи");
        textBtrInfo.setText(" " + getBatteryTemperatute(this).toString());
        textChrgInfo.setText(" " + getBatteryLevel(this).toString());
 
 
  }
Добавлено через 12 минут
Кто сможет по skype дать нужный совет? Экран покажу, если нужно дам удаленный доступ.
Pablito
2473 / 1918 / 595
Регистрация: 12.05.2014
Сообщений: 6,742
Завершенные тесты: 1
12.10.2016, 12:45 #6
Цитата Сообщение от MrArty Посмотреть сообщение
textBatteryInfo = (TextView) findViewById(R.id.textBatteryInfo); textBatteryTemperature = (TextView) findViewById(R.id.textBatteryTemperature); textBatteryInfo.setText("Заряд батареи"); textBatteryTemperature.setText("Температура батареи"); textBtrInfo.setText(" " + getBatteryTemperatute(this).toString()); textChrgInfo.setText(" " + getBatteryLevel(this).toString());
Цитата Сообщение от MrArty Посмотреть сообщение
/пытаюсь вызвать фрагмент при старте системы, верно? /*Конец моего кода*/
если это все элементы из разметки фрагмента то их надо там и искать - во фрагменте, в onCreateView
MrArty
0 / 0 / 0
Регистрация: 27.01.2016
Сообщений: 32
12.10.2016, 12:47  [ТС] #7
Верно, это элементы из фрагмента. Когда этот фрагмент я помещаю в статический контейнер <fragment> то они находятся именно таким способом. Почему не работает с динамическим?
Pablito
2473 / 1918 / 595
Регистрация: 12.05.2014
Сообщений: 6,742
Завершенные тесты: 1
12.10.2016, 12:55 #8
Цитата Сообщение от MrArty Посмотреть сообщение
статический контейнер
я не знаю таких слов

Цитата Сообщение от MrArty Посмотреть сообщение
очему не работает с динамическим
потому что там не код, а каша
выше я уже написал что искать их надо не в активити

XML
1
2
3
4
5
6
7
8
<fragment
    android:id="@+id/fragCont"
    android:name="com.leonov.smartdiagfrag.Fragment1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1"
    tools:layout="@layout/fragment1">
</fragment>
это лучше убрать из контейнера фрагментов и при старте активити помещаться туда фрамент через транзакцию
особо разницы нет, но транзакция - это пара строк кода и в разметке будет чище
MrArty
0 / 0 / 0
Регистрация: 27.01.2016
Сообщений: 32
12.10.2016, 12:59  [ТС] #9
Ну как же. По всем урокам с фрагментами есть два типа взаимодействия с фрагментами. Статическим способом, поместив фрагмент сразу в <fragment> либо динамическим способом, поместим фрагмент допустим в <LinearLayout>.
Pablito
2473 / 1918 / 595
Регистрация: 12.05.2014
Сообщений: 6,742
Завершенные тесты: 1
12.10.2016, 13:04 #10
они находятся потому что фрагмент при inflate разметки активити там есть тоже и можно найти вьюшки фрагмента по id
но так не делается
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.10.2016, 13:04
Привет! Вот еще темы с ответами:

Обращение к фрагменту вне активити - Программирование Android
Здравствуйте, форумчане! Назрел такой вот вопрос: создан класс BannerFragment, унаследованный от фрагмента. В нём переопределён...

Как реализовать обращение из SurfacView к TextView в основной Активити - Программирование Android
Всем Добрый День! Не знаю правильно или нет, но хотел сделать разметку поделив экран на две области, нижняя область отображает графику, в...

Обращение к другому элементам другой формы? - Программирование Android
Здравствуйте. Подскажите: есть несколько activity, как обратиться из одной, к элементам другой? например, во второй форме есть кнопка, как...

На телефоне highscreen 3 на всех активити происходит быстрый самовозврат к главной активити - Программирование Android
Сделал меню в виде ListView. При клике на меню запускаются активити. На эмуляторе работает, на телефоне моем LG все работает. На телефоне...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
12.10.2016, 13:04
Ответ Создать тему
Опции темы

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