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

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

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

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

12.10.2016, 02:08. Просмотров 249. Ответов 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());
  }

Поясните новичку, уже два дня курю тему по фрагментам, никак не могу понять.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fraley
95 / 95 / 34
Регистрация: 24.05.2015
Сообщений: 285
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
Смотрел уже, и урок от Девколибри. Не срабатывает.
Паблито
2025 / 1767 / 548
Регистрация: 12.05.2014
Сообщений: 6,265
Завершенные тесты: 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 дать нужный совет? Экран покажу, если нужно дам удаленный доступ.
Паблито
2025 / 1767 / 548
Регистрация: 12.05.2014
Сообщений: 6,265
Завершенные тесты: 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> то они находятся именно таким способом. Почему не работает с динамическим?
Паблито
2025 / 1767 / 548
Регистрация: 12.05.2014
Сообщений: 6,265
Завершенные тесты: 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>.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.10.2016, 13:04     Обращение к элементам фрагмента из активити
Еще ссылки по теме:

Android Обращение к фрагменту вне активити
Обращение к View элементам фрагмента Android
Android Пересоздание активити
Как нажать кнопку основого активити из фрагмента Android
Android Повторное создание фрагмента внутри фрагмента ViewPager

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

Или воспользуйтесь поиском по форуму:
Паблито
2025 / 1767 / 548
Регистрация: 12.05.2014
Сообщений: 6,265
Завершенные тесты: 1
12.10.2016, 13:04     Обращение к элементам фрагмента из активити #10
они находятся потому что фрагмент при inflate разметки активити там есть тоже и можно найти вьюшки фрагмента по id
но так не делается
Yandex
Объявления
12.10.2016, 13:04     Обращение к элементам фрагмента из активити
Ответ Создать тему
Опции темы

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