Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
oleggy
5 / 5 / 0
Регистрация: 14.03.2013
Сообщений: 156
1

Аналог Fragment.getActivity() в классе AppCompatActivity

23.06.2018, 14:01. Просмотров 1014. Ответов 17
Метки нет (Все метки)

Добрый день.
Возникла задача код который был реализован в фрагменте (класс Fragment) перенести в активность (класс AppCompatActivity).

При переносе кода возник вопрос что делать с функцией getActivity().
Т.к. в классе AppCompatActivity такой функции нет (getActivity).
Подскажите чем можно заменить getActivity?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.06.2018, 14:01
Ответы с готовыми решениями:

Ошибка "ссылка на нулевой объект" в классе, наследуемом от Fragment
Здравствуйте! Я хочу добавить Twitter api, но не могу это правильно сделать. Из-за этого...

Обновление fragment из другого fragment
Добрый вечер всем!! Подскажите пожалуйста как обновить один фрагмент из другого (а именно TextView...

Ошибка в контекстном меню AppCompatActivity
Здравствуйте! Я только начинаю изучать разработку под Android. Использую IDE Android Studio...

IntelliJ IDEA. cannot resolve symbol 'AppCompatActivity'
Создал новый проект Android. Весь исходный код подсвечен красный и пишет: IntelliJ IDEA. cannot...

Доля отличников в классе больше 2/5, но меньше 3/7, а всего в классе не более 15 учеников. Сколько всего в классе учеников?
Добрый вечер! Подскажите, пожалуйста! "Доля отличников в классе больше 2/5, но меньше 3/7, а...

17
ExFau$t
764 / 630 / 157
Регистрация: 08.05.2012
Сообщений: 3,079
23.06.2018, 22:32 2
AppCompatActivity - это и есть активити, неужели из названий не очевидно? Соответственно, метод getActivity в активити нахрен не нужен, просто убрать.
0
oleggy
5 / 5 / 0
Регистрация: 14.03.2013
Сообщений: 156
24.06.2018, 09:25  [ТС] 3
У меня изначально функционал приложения находился в фрагменте.
Функция getActivity() которая мелькала внутри класса фрагмента использовалась длятогого что бы реализовать работу различных диалоговых окон (ранее внутри фрагмента).
А теперь я этот весь код перенес в AppCompatActivity.
Вот ниже код такого диалогового окна:

Кликните здесь для просмотра всего текста
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
    // класс отображения диалогового окна с сообщением об ошибке
    public static class ErrorDialog extends DialogFragment {
 
        private static final String ARG_MESSAGE = "message";
 
        public static ErrorDialog newInstance(String message) {
            ErrorDialog dialog = new ErrorDialog();
            Bundle args = new Bundle();
            args.putString(ARG_MESSAGE, message);
            dialog.setArguments(args);
            return dialog;
        }
 
        @NonNull
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
        
            final Activity activity = getActivity();
            return new AlertDialog.Builder(activity)
                    .setMessage(getArguments().getString(ARG_MESSAGE))
                    .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            activity.finish();
                        }
                    })
                    .create();
        }
        
    }


Вопрос на что в нем заменить getActivity() что бы диалоговое окно функционировало?
0
ExFau$t
764 / 630 / 157
Регистрация: 08.05.2012
Сообщений: 3,079
24.06.2018, 19:38 4
Ответ в сообщении №2.
0
24.06.2018, 19:38
oleggy
5 / 5 / 0
Регистрация: 14.03.2013
Сообщений: 156
25.06.2018, 04:52  [ТС] 5
Верно ли я понял что можно просто this использовать?
0
ExFau$t
764 / 630 / 157
Регистрация: 08.05.2012
Сообщений: 3,079
25.06.2018, 09:18 6
Можно, но проверить, конечно, дольше, чем написать сюда.
4
oleggy
5 / 5 / 0
Регистрация: 14.03.2013
Сообщений: 156
26.06.2018, 07:59  [ТС] 7
ExFau$t, спасибо. Конечно проверю, но просто сейчас нет доступа к студии.
У меня еще в коде заметил присутствует функция - getChildFragmentManager():
Пример строки:
Java
1
new ConfirmationDialog().show(getChildFragmentManager(), FRAGMENT_DIALOG);
Что можете посоветовать, чем заменить ее в активности?

Добавлено через 15 минут
Я так понял что эта функция возвращает объект менеджера фрагментов для управления фрагментом диалогового окна внутри другого фрагмента (так?).
Но сейчас данное диалоговое окно будет внутри активности AppCompatActivity соответственно вызов данной функции не работает (ошибка).
0
Pablito
2836 / 2254 / 762
Регистрация: 12.05.2014
Сообщений: 7,892
Завершенные тесты: 1
26.06.2018, 10:51 8
работает, ошибки нет
0
oleggy
5 / 5 / 0
Регистрация: 14.03.2013
Сообщений: 156
28.06.2018, 20:37  [ТС] 9
Добрался до студии.
И при корректировке метода для работы внутри класса AppCompatActivity вместо Fragment:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
        public void onError(@NonNull CameraDevice cameraDevice, int error) {
            mCameraOpenCloseLock.release();
            cameraDevice.close(); // закрытие сеанса захвата с CameraDevice
            mCameraDevice = null;
 
            //Activity activity = getActivity(); // ранее было в Fragment
            Activity activity = this; // корректировка для AppCompatActivity 
 
            if (null != activity) {
                activity.finish();
            }
        }

При замене:
Java
1
Activity activity = getActivity();
На:
Java
1
Activity activity = this;
Система подчеркивает последнюю строку.
https://image.ibb.co/bPqMfT/2018_06_29_00_30_37.png
https://image.ibb.co/jVaF78/2018_06_29_00_31_24.png
Не могу понять почему студия ругается на несоответствие типа..
Ведь класс AppCompatActivity в котором теперь весь код, это же и есть активность.
0
Mail-up
30 / 28 / 8
Регистрация: 07.01.2017
Сообщений: 205
28.06.2018, 22:14 10
Java
1
Activity activity = this;
ЗАЧЕМ?

Сие действие происходит в активити , поэтому она сылается сама на себя и итак this
И весь этот код не имеет смысла.



Java
1
this.finish
Добавлено через 6 минут
это лишнее

Java
1
2
3
4
5
6
//Activity activity = getActivity(); // ранее было в Fragment
            Activity activity = this; // корректировка для AppCompatActivity 
 
            if (null != activity) {
                activity.finish();
            }
1
oleggy
5 / 5 / 0
Регистрация: 14.03.2013
Сообщений: 156
29.06.2018, 16:49  [ТС] 11
Спасибо. Все логично.
Но вместо этого:
Java
1
this.finish()
Только такой вариант пропустила.
Java
1
finish()
Проблема еще с корректировкой этого метода.
Изначальный вид:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
    private void showToast(final String text) {
        final Activity activity = getActivity();
 
        if (activity != null) { 
            activity.runOnUiThread(new Runnable() { 
            runOnUiThread(new Runnable() {
                @Override
                public void run() { 
                    Toast.makeText(activity, text, Toast.LENGTH_SHORT).show();
                }
            });
        }
    }


Исправил на:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
    private void showToast(final String text) {
 
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
                }
            });
    }

Но студия все равно ругается:
https://image.ibb.co/nnrVsJ/2018_06_29_20_41_45.png
https://image.ibb.co/cL7s6d/2018_06_29_20_42_57.png
не могу понять что исправить? Что ей нужно? Почему не опознает?

Я просто заменил activity на this.
0
ExFau$t
764 / 630 / 157
Регистрация: 08.05.2012
Сообщений: 3,079
29.06.2018, 17:06 12
Мдааа.. Попробуй: ActivityName.this
0
oleggy
5 / 5 / 0
Регистрация: 14.03.2013
Сообщений: 156
29.06.2018, 17:43  [ТС] 13
Может я не так понял? Исправил, студия выдает:
https://image.ibb.co/mFQAbd/2018_06_29_21_37_53.png
Зашел в android developers, нашел определение функции:
Java
1
2
3
4
public static Toast makeText (Context context, 
                int resId, 
                int duration)
Make a standard toast that just contains a text view with the text from a resource.
Вроде все правильно.
Класс AppCompatActivity (в котором сейчас весь код) является наследником Context, вот:

java.lang.Object
↳ android.content.Context
↳ android.content.ContextWrapper
↳ android.view.ContextThemeWrapper
↳ android.app.Activity
↳ android.support.v4.app.FragmentActivity
↳ android.support.v7.app.AppCompatActivity

Что студию не устраивает...?
0
Pablito
2836 / 2254 / 762
Регистрация: 12.05.2014
Сообщений: 7,892
Завершенные тесты: 1
29.06.2018, 17:46 14
боже, какой же ты тугой
ActivityName значит что там надо писать имя твоей активити, а не дословно ActivityName

ошибку там светит потому что this "внутри" блока runOnUiThread указывает на Runnable, а не на контекст
поэтому надо явно указать ИмяАктивити.this
2
oleggy
5 / 5 / 0
Регистрация: 14.03.2013
Сообщений: 156
29.06.2018, 18:05  [ТС] 15
Теперь понял. Скорректировал.

У меня последний вопрос: метод getChildFragmentManager().
Присутствовал в нескольких местах класса Fragment, так же участвовал при создании диалоговых окон:

Примеры где он был:
Java
1
new ConfirmationDialog().show(getChildFragmentManager(), FRAGMENT_DIALOG);
Java
1
2
ErrorDialog.newInstance(getString(R.string.request_permission))
                        .show(getChildFragmentManager(), FRAGMENT_DIALOG);
Студия естественно пишет что не опознает метод.
Т.к. этот метод относится к классу Fragment, а сейчас весь код в AppCompatActivity.

Выше Pablito в посте №8 написал что у него ошибок нет. Не совсем понял почему.

Я так понял надо этот метод заменить внутри активности. Может подскажете?
0
Pablito
2836 / 2254 / 762
Регистрация: 12.05.2014
Сообщений: 7,892
Завершенные тесты: 1
29.06.2018, 18:14 16
Лучший ответ Сообщение было отмечено oleggy как решение

Решение

getSupportFragmentManager()
1
oleggy
5 / 5 / 0
Регистрация: 14.03.2013
Сообщений: 156
30.06.2018, 16:42  [ТС] 17
Спасибо. Все успешно перенес.
Pablito, подскажи а по какой методике ты смог подобрать замену getChildFragmentManager() на getSupportFragmentManager() ?
Просто тогда в классе Fragment было понятно что getChildFragmentManager() возвращала дочерний фрагмент что бы в нем создать диалоговое окно ошибки или еще чего.
Но вот что можно было найти внутри класса активности - AppCompatActivity ? Я думал что нужно получить какую то дочернюю активность..
0
264D
33 / 35 / 9
Регистрация: 03.02.2017
Сообщений: 130
03.07.2018, 17:30 18
Цитата Сообщение от oleggy Посмотреть сообщение
Может я не так понял? Исправил, студия выдает:
https://image.ibb.co/mFQAbd/2018_06_29_21_37_53.png

Не по теме:

Падсталом.:rofl::rofl::rofl: Вы сделали мой день!

0
03.07.2018, 17:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2018, 17:30

Как использовать объект класса, созданого в определеном классе, в другом классе
У меня такой вопрос,как использовать объект класса,созданого в определеном классе,в другом классе.У...

В классе инициализировать массив, в классе создать функцию вывода массива на экран
Прошу помоши с выводом данных, которые содержаться в массиве, на экраy: Задача: В классе...

Как обьявить переменную в одном классе и что бы ее было видно в дочернем классе
У меня есть основной класс с названием Root один из его членов наследует дочерний класс SubRoot....


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

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