Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
znseday
18 / 18 / 7
Регистрация: 20.03.2012
Сообщений: 483
1

Доступ к элементам управления одной активности через другую

23.04.2015, 22:37. Просмотров 1721. Ответов 41
Метки нет (Все метки)

Имеется две активности. Когда запускаю вторую активность, первую не выгружаю (не удаляю).
Можно ли сделать так, чтобы вторая активность имела доступ к элементам управления первой активности?
Я пробовал, например так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class SecondActivity extends Activity
{
 
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);      
 
        setContentView(R.layout.activity_second);
 
        CheckBox MyCheckBoxInFirstActivity = (CheckBox)findViewById(R.id.checkBoxInFirstActivity);
 
        MyCheckBoxInFirstActivity.setVisibility(View.GONE); // на этой строчке программа вылетает с ошибкой
 
    }     
  
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.04.2015, 22:37
Ответы с готовыми решениями:

Данные не передаются из одной активности в другую
Данные не передаются в другую активность... Вот код: Из: Intent inttt = new...

Передача данных из одной активности в третью
Есть главное активити. Оно вызывает второе, второе самоудаляется vtnjljv...

Изменение настроек приложения из активности в рамках активности
Друзья, помогите разобраться! имею наработки приложения-рисовалки, там есть...

Доступ к элементам Activity из другого класса
Есть Activity, в её классе создаю экземпляр другого класса twoclass tw = new...

Доступ к элементам вью во время создания Activity
Есть Activity. На ней textView. Мне нужно поставить этот textView в...

41
Slon747
59 / 37 / 2
Регистрация: 24.08.2013
Сообщений: 516
23.04.2015, 23:01 2
Потому как MyCheckBoxInFirstActivity=null
Откуда желание изменять первую активность из второй? Почему бы не обновить элементы в onResume()?
0
znseday
18 / 18 / 7
Регистрация: 20.03.2012
Сообщений: 483
24.04.2015, 13:07  [ТС] 3
Slon747, Вторая активность - окно с настройками. Настроек очень много, передавать туда-сюда данные через интенты (например) не хочется.
Цитата Сообщение от Slon747 Посмотреть сообщение
Почему бы не обновить элементы в onResume()?
Да, можно, наверное.. Я уже думал насчет onActivityResult, например.
Я не пойму как получить доступ к данным первой активити из второй, чтобы не создавать копии этих данных?
Я только-только перешел с c++ на java, и отсутствие указателей и глобальных объектов меня немного тормозит.
0
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
24.04.2015, 15:21 4
znseday, пишите настройки сразу в sharedPreferencess и никаких проблем.
0
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,074
24.04.2015, 16:18 5
Этож ищется в текущей активности, конечно null будет если checkBoxInFirstActivity отсутствует на R.layout.activity_second
Цитата Сообщение от znseday Посмотреть сообщение
CheckBox MyCheckBoxInFirstActivity = (CheckBox)findViewById(R.id.checkBoxInFirstActivity);
0
znseday
18 / 18 / 7
Регистрация: 20.03.2012
Сообщений: 483
24.04.2015, 16:37  [ТС] 6
Цитата Сообщение от Spelcrawler Посмотреть сообщение
пишите настройки сразу в sharedPreferencess и никаких проблем
У меня есть главная активность, и в ней есть переменная типа sharedPreferencess. В этой же активности я сохраняю и загружаю настройки. А как передать sharedPreferencess второй активности, чтобы она изменила настройки?

т.е. теоретически, я могу во второй активности сохранить настройки в файл, а затем опять его прочитать в первой активности. Но должен же быть способ проще и быстрее?
0
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,074
24.04.2015, 17:21 7
sharedPreferencess можешь хоть откуда читать, а если не обязательно сохранять данные м/у запусками приложения, то можно использовать static переменную.
0
Mikalai
264 / 240 / 95
Регистрация: 11.01.2015
Сообщений: 671
24.04.2015, 17:45 8
znseday, проще некуда
В одной активити сохраняешь:
Java
1
2
SharedPreferences sp = getPreferences(MODE_PRIVATE);
sp.edit().putString("myStringKey", "Моя строка").putInt("myIntKey", 33).commit();
В любой другой активити этого приложения достаёшь :

Java
1
2
3
SharedPreferences sp = getPreferences(MODE_PRIVATE);
String str = sp.getString("myStringKey", "Строка по умолчанию");
int i = sp.getInt("myIntKey", 0);
0
znseday
18 / 18 / 7
Регистрация: 20.03.2012
Сообщений: 483
24.04.2015, 17:56  [ТС] 9
Mikalai, разве
Java
1
sp.edit().putString("myStringKey", "Моя строка").putInt("myIntKey", 33).commit();
не записывает данные в файл? Просто это как-то странно получается обмениваться данными через файл...
0
Mikalai
264 / 240 / 95
Регистрация: 11.01.2015
Сообщений: 671
24.04.2015, 18:05 10
Как тут уже писали можешь сделать статик переменную или вызывать активити через интент, правда тогда откроется новое активити( Android - Передача данных с одного Activity на другое Activity )
0
znseday
18 / 18 / 7
Регистрация: 20.03.2012
Сообщений: 483
24.04.2015, 18:18  [ТС] 11
Про интенты знаю, спасибо, но как-то муторно. Тем более, что мне желательно не простые типы данных передавать, а объекты. Попробую через статик.
0
Pablito
2731 / 2166 / 735
Регистрация: 12.05.2014
Сообщений: 7,582
Завершенные тесты: 1
24.04.2015, 19:27 12
Тут просто нужно для себя понять такую штуку - активити, это отдельные логические "куски" в архитектуре программы, их желательно делать максимально независимыми друг от друга.

Если первая активити подготовила для второй какие-то данные то их можно передавать либо через статические поля, либо через intent.putExtras.
В соседних темах я немного поспорил со знающими людьми на тему статик полей, подумал и теперь придерживаюсь того же мнения что и они - статик поля не самый надежный метод передачи, могут быть нюансы.

На вопрос "а как доступиться к даным, которые в первой активити?" можно ответить так - надо выстроить логику программы так что бы не возникало желания куда-то лезть за этими данными Они должны быть подготовлены и переданы через intent.putExtras()
Это чисто имхо.
http://developer.android.com/guide/faq/framework.html#3
0
znseday
18 / 18 / 7
Регистрация: 20.03.2012
Сообщений: 483
24.04.2015, 20:01  [ТС] 13
Паблито, а что вы думаете насчет Singleton class?
0
Pablito
2731 / 2166 / 735
Регистрация: 12.05.2014
Сообщений: 7,582
Завершенные тесты: 1
24.04.2015, 20:07 14
так активити и есть синглтоны по идее
пусть меня поправят если ошибаюсь
0
znseday
18 / 18 / 7
Регистрация: 20.03.2012
Сообщений: 483
24.04.2015, 20:15  [ТС] 15
если активити это синглинтон, то почему доступ к полям активити может быть только через статик? Что-то я совсем запутался....
0
Mikalai
264 / 240 / 95
Регистрация: 11.01.2015
Сообщений: 671
24.04.2015, 20:15 16
Паблито, вроде как нет. Ты можешь открыть активити А, из него открыть активити В, из него сново открыть активити А. В итоге, если ты не закрывал старые активити, одно активити А будет в бекстеке, другое в фокусе. Вроде так.
0
Pablito
2731 / 2166 / 735
Регистрация: 12.05.2014
Сообщений: 7,582
Завершенные тесты: 1
24.04.2015, 20:42 17
я не говорил что только через статик, наоборот, я писал что все-таки лучше пользоваться интентами
там делов-то 2-3 строчки что бы запаковать данные и еще 2 что бы достать в другой активити

Добавлено через 24 минуты
допустим у нас есть две активити - MyActivity и SecondActivity
что-бы передать данные из первой во вторую создаем простой класс, назовем его A
Java
1
2
3
4
class A implements Serializable {
    int anInt;
    ArrayList<String> list;
}
поля взяты для примера, типа передаем число и список строк

1. упаковываем все, что нужно передать
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class MyActivity extends Activity {
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        ArrayList<String> list = new ArrayList<>();
        list.add("строка 1");
        list.add("еще строка");
 
        A a = new A();
        a.anInt = 42;
        a.list = list;
 
        Intent intent = new Intent(this, MySecondActivity.class);
        intent.putExtra("ourData", a);
        startActivity(intent);
    }
}


2. достаем во второй активити наши данные
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
public class MySecondActivity extends Activity {
 
    @Override
    protected void onResume() {
        super.onResume();
        A a = (A) getIntent().getSerializableExtra("ourData");
        Log.i("===", a.list.get(0));
    }
}
1
znseday
18 / 18 / 7
Регистрация: 20.03.2012
Сообщений: 483
25.04.2015, 01:19  [ТС] 18
Паблито, спасибо за пример. Хм... не помню где, но читал, что вроде через интенты можно передавать только простые типы данных. Выходит, что я могу передавать целые сложные объекты (например, "а" типа "А" в данном примере)?
В данном примере создается копия данных, или работа идет с первоначальным объектом "а" из первой активити?
0
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
25.04.2015, 13:25 19
Цитата Сообщение от znseday Посмотреть сообщение
Выходит, что я могу передавать целые сложные объекты
Да можно, только класс, который вы передаете должен реализовывать интерфейс Serializable.
Цитата Сообщение от znseday Посмотреть сообщение
В данном примере создается копия данных, или работа идет с первоначальным объектом
Передается копия.
1
znseday
18 / 18 / 7
Регистрация: 20.03.2012
Сообщений: 483
25.04.2015, 14:03  [ТС] 20
Цитата Сообщение от Spelcrawler Посмотреть сообщение
Передается копия.
Ясно.
Spelcrawler, а можно как-то передавать что-то типа указателя (как в c++)?

Паблито, в той вашей ссылке на документацию меня совсем добила фраза:
Even while an application appears to continue running, the system may choose to kill its process and restart it later.
Получается, что если, например, в моем приложении в главной активности есть переменная
Java
1
int a;
и во время работы с программой пользователь переключится на другую (например, смс, браузер и т.п.), то после возвращения в мою программу значение переменной "a" может уже стереться не смотря на то, что процесс моей программы все это время висел в ОЗУ?
0
25.04.2015, 14:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.04.2015, 14:03

Портирование с одной версии на другую
Добрый вечер, хотелось бы узнать как портировать приложения с версии 4.3 или...

Передать параметр из одной в другую
Добрый вечер. Тут небольшая проблема. Как передать (ID) - С одной...

Перевод из одной системы счисления в другую
Есть скрипт на javascript &lt;script language=&quot;JavaScript&quot;&gt; b=...


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

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

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