Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 11.06.2022
Сообщений: 5

Реализация setOnClickListener в фрагменте

11.06.2022, 08:25. Показов 1203. Ответов 7

Студворк — интернет-сервис помощи студентам
Привет всем!

Пытаюсь тут реализовать обработку нажатия на графических элементах, расположенных внутри фрагмента.
Пытаюсь использовать setOnClickListener. На эту тему можно найти много аналогичных сообщений, и везде излагается одна и та же его реализация (плюс, минус). Но вот проблема, у меня он не работает! Т.е. никакой обработки нажатия не производится.

Давайте, теперь покажу, что у меня есть.

Ниже представлен код MainActivity
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
public class MainActivity extends AppCompatActivity implements MyListner {
    Fragment2 fragment2;
    Fragment1 fragment1;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        fragment2 = new Fragment2();
        setContentView(R.layout.activity_main);
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();//начало транзакции объекта
        ft.replace(R.id.container, fragment2);
        ft.addToBackStack(null);
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
        ft.commit();
 
    }
 
    @Override
    public void callback() {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();//начало транзакции объекта
        ft.replace(R.id.container, fragment1);
        ft.addToBackStack(null);
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
        ft.commit();
    }
}
Ниже представлен код Fragment2, в котором хочу реализовать обработку.... ну кнопки например:

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 Fragment2 extends Fragment  {
    Button button;
    MyListner listner;
 
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View getview = inflater.inflate(R.layout.fragment_2, container, false);
        button = (Button) getview.findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                button.setText("Wow");
                //listner.callback();
            }
        });
        return inflater.inflate(R.layout.fragment_2, container, false);
    }
 
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        this.listner =(MyListner) context;
    }
}
Ну и сам интерфейс

Java
1
2
3
public interface MyListner {
    public void callback();
}
Если аналогичное решение реализовывать в Activity, то все работает, но внутри фрагмента - нет.

Подскажите, что тут не так?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.06.2022, 08:25
Ответы с готовыми решениями:

Вывод во втором фрагменте длины текста, введённого в первом фрагменте активити
Создать активити с двумя фрагментами. В первый фрагмент должен содержать поле ввода, второй текстовое поле. Выводить во втором фрагменте...

Ошибка Button.setOnClickListener
import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; ...

Переключить setOnTouchListener с setOnClickListener в TextView
Всем привет! Как можно переключать setOnTouchListener с setOnClickListener в TextView? Заранее спасибо! :)

7
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
11.06.2022, 10:24
Интерфейс из активити нужно передать в фрагмент.
0
0 / 0 / 0
Регистрация: 11.06.2022
Сообщений: 5
11.06.2022, 11:00  [ТС]
Извиняюсь, не совсем понял, что нужно сделать...

Вообще внутри фрагмента можно менять какие-то свойства элементов?

Ниже немного упрощу код в фрагменте:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Fragment2 extends Fragment  {
    Button button;
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View getview = inflater.inflate(R.layout.fragment_2, container, false);
        button = (Button) getview.findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                button.setText("Wow");
            }
        });
        return inflater.inflate(R.layout.fragment_2, container, false);
    }
}
То есть я просто реализую слушателя, через который, при нажатии на кнопку, меняет текст на кнопке.
Опять же, в активити это работает, а в фрагменте нет.
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
11.06.2022, 11:58
Можно, в методе onViewCreated
0
0 / 0 / 0
Регистрация: 11.06.2022
Сообщений: 5
11.06.2022, 12:08  [ТС]
Так в этом методе и описан код. Не работает!
0
93 / 66 / 27
Регистрация: 23.06.2019
Сообщений: 477
11.06.2022, 17:25
Лучший ответ Сообщение было отмечено vaston-ru как решение

Решение

"не работает" требует более подробного описания.

Добавлено через 1 минуту
Если никаких ошибок при компиляции, запуске и нажатии кнопки, то просто не на ту кнопку жмете.

Добавлено через 1 минуту
Или не на ту кнопку OnClickListener привязываете.

Добавлено через 28 минут
Цитата Сообщение от vaston-ru Посмотреть сообщение
Так в этом методе и описан код. Не работает!
Вообще-то onCreateView и onViewCreated - это разные методы.

Добавлено через 8 минут
Ошибка тут:
Java
1
        return inflater.inflate(R.layout.fragment_2, container, false);
Надо:
Java
1
return getview;
Добавлено через 4 минуты
Дважды inflater.inflate вызывается. Первый раз присваивается значение к getview. Странное название. Оно не гет.
Это либо view, либо root. Хотя как угодно можно зывать. Но сразу заметно непонимание процесса.

Второй раз при возврате из метода. И все, что делали с вьюшками - все теряется.

Добавлено через 13 минут
C вторым inflater.inflate(R.layout.fragment_2, container, false); все вьюшки создаются заново. Что было изменено во вьюшках до этого - все остается с теми старым вьюшками, которые уже не отображаются.
1
0 / 0 / 0
Регистрация: 11.06.2022
Сообщений: 5
12.06.2022, 19:28  [ТС]
Да, я только учусь писать подобные программы, самоучка, поэтому прошу сильно не удивляться моим ошибкам.

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

Дважды inflater.inflate вызывается. Первый раз присваивается значение к getview. Странное название. Оно не гет.
Это либо view, либо root. Хотя как угодно можно зывать. Но сразу заметно непонимание процесса.
getview - стандартная формулировка, которую встретил в книге, там именно так и указано...

Здесь я особо ничего не придумывал. использованные методы описаны при формировании фрагмента в @Override, как было, так и оставил.

И действительно проблема была в этом, после того как прописал return getview; обработка нажатия кнопки заработала.

Большое спасибо за Ваш совет. Вот так и приходиться на ошибках учиться))
0
93 / 66 / 27
Регистрация: 23.06.2019
Сообщений: 477
12.06.2022, 20:01
Цитата Сообщение от vaston-ru Посмотреть сообщение
Вот это немного для меня новость, потому что, на сколько я знал, в описаниях жизненного цикла фрагмента, такого метода я не встречал.
Описание жизненного цикла фрагмента одно oт разработчиков:
https://developer.android.com/... /lifecycle
И там мне кажется я вижу оба метода:

Цитата Сообщение от vaston-ru Посмотреть сообщение
встретил в книге
Какая книга? ОНИ Вас (и всех остальных людей планеты, которые эту книгу читают) обманывают.
Даже с самыми благими намерениями невозможно делать книги. Это требует время. Пока книга выйдет в продажу на прилавки книжных магазинов, все о чем там написано за предыдущие годы, все безбожно устарело.
Есть же у гугла кодлабы и гайды для разработчиков. Там тоже не без косяков. Но все остальные перепиывают отсюда.
А называть переменную созвучно с конкретным методом (getView), но присвоенным совсем от другого метода, вообще-то - это введение людей в заблуждение и запутывание.

Цитата Сообщение от vaston-ru Посмотреть сообщение
только учусь
А андроиде все каждый день меняется по нескольку раз. Поэтому все разработчики андроида бесконечно "только учатся". Как у склеротиков, каждую минуту все опять новое.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.06.2022, 20:01
Помогаю со студенческими работами здесь

SetOnClickListener исчезает глобальная переменная
Помогите исчезает глобальная переменная //Здесь переменная выводится нормально Log.d(LOG_TAG, "Моя...

Не могу задать банальные setOnClickListener
Делаю первые шаги в программировании под Andoriod. Запускаю в эмуляторе. Приложение падает. Как я понял - проблема в обрботчике клика на...

Использование enum для setOnClickListener
Есть activity и на ней много кнопок. Нажимая конкретную кнопку открываем новую activity с определенными параметрами для textview. Использую...

Вылет setOnClickListener при условии false
Есть обычный код, но суть в выполнении при условии, а если условие не выполняется, то пустое нажатие. boolean inx; int a; .... ...

Кто знает как отследить button.setOnClickListener?
хочу что то типа button.setOnTouchListener(this); @Override public boolean onTouch(View view, MotionEvent...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru