Как организовать общие переменные и функции?

Ответить
Oleg_SS
Сообщения: 34
Зарегистрирован: 11 янв 2012, 10:59

Как организовать общие переменные и функции?

Сообщение Oleg_SS » 14 янв 2012, 06:49

Создаю отдельный класс в отдельном файле и не могу обратиться к ресурсам.

Код: Выделить всё

package my.namespace;
import android.content.res.Resources;
public class MyCommon {
    String name_File_Ini;            // Имя файла настроек
    Resources myResources_Ini;
    public String getNameIniFile() {
        myResources_Ini = getResources();   // !!!!! Ругается The method getResources() is undefined for the type AutoSMSCommon
        name_File_Ini = "/Android/data/" +                                  // Общий каталог программ 
            myResources_Ini.getString(R.string.app_name) + "/" +            // Каталог для Auto SMS 
            myResources_Ini.getString(R.string.app_name) + ".ini";          // Имя файла
        return name_File_Ini;
    }
}

и еще если я создам в активити переменную, которая бутет ссылаться на MyCommon, то как мне сослаться на эту переменную из другой активити?
Ведь насколько я понимаю, если я скажу new в каждом активити, то это будут разные переменные, указывающие на MyCommon. А мне надо в одной активити создать переменную, а в другой прочитать ее значение.
Варианты с передачей данных между активностями уже рассматривал. Дело в том, что мне надо передавать сложные массивы, а передача данных между активностями работает, если данные простые.
Тип передаваемых мной переменных выглядит так:
Hashtable<String, Hashtable<String, String>>

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Как организовать общие переменные и функции?

Сообщение damager82 » 14 янв 2012, 18:35

Oleg_SS писал(а):Создаю отдельный класс в отдельном файле и не могу обратиться к ресурсам.
getResources не срабатывает, потому что нужен Context. Activity его наследует, поэтому умеет ресурсы юзать. Как вариант, создайте конструктор с параметром Сontext и при создании объекта в Activity, передавайте туда this.

А вообще Intent позволяет как-то передавать сложные объекты, но я еще не разбирался с этим.
public Intent putExtra (String name, Serializable value)
Может кто знает?
А мне надо в одной активити создать переменную, а в другой прочитать ее значение.
Используйте static объекты. Они всегда в одном экземпляре. http://docs.oracle.com/javase/tutorial/ ... svars.html
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
mdzht
Сообщения: 124
Зарегистрирован: 11 ноя 2013, 11:33
Откуда: fock it
Контактная информация:

Re: Как организовать общие переменные и функции?

Сообщение mdzht » 26 янв 2014, 12:24

Привет коллеги! Не могу сообразить, уже месяц бьюсь головой об стену. Необходимо передать ключи по нажатию кнопки.
В первом классе MainActivity.java

Код: Выделить всё

	
        @Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.btn1:
			Intent i = new Intent(MainActivity.this,NextActivity.class);
			i.putExtra("name", txtNameId.getText().toString());
			i.putExtra("link_image",txtLinkImage.getText().toString());
			startActivity(i);
		break;
                 }
        }
NextActivity.java

Код: Выделить всё

  
        public String TAG_NAME_ID;  // Если тут же приписывать то все работает отлично, но у меня в MainActivty не один button, а несколько
	public String TAG_LINK_IMAGE; // public static final String TAG_NAME_ID="name"; = works!
        @Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.list_myapp);
             
                Intent i = getIntent();
		
                TAG_NAME_ID = i.getStringExtra("name");
		TAG_LINK_IMAGE = i.getStringExtra("link_image");
                 .......
               }
           ......
	protected String doInBackground(String... args) {
      ...
        String txt_name = c.getString(TAG_NAME_ID);
	String rus_detail_text_image_k = c.getString(TAG_LINK_IMAGE);    
        }

в адаптере ListAdapter.java

Код: Выделить всё

      public ImageLoader imageLoader;
        ......
        public View getView(int position, View convertView, ViewGroup parent) {
		View v = convertView;
		if (convertView == null)
			v = inflater.inflate(R.layout.item_list, null);		
		
                TextView name = (TextView) v.findViewById(R.id.name);
		TextView link_image = (TextView) v.findViewById(R.id.link_image);
                ImageView iv = (ImageView) v.findViewById(R.id.image);
	        
                HashMap<String, String> list = new HashMap<String, String>();
		list  = data.get(position);
		
                name.setText(list.get(NextKitchenActivity.TAG_NAME_ID));
		link_image.setText(list.get(NextKitchenActivity.TAG_LINK_IMAGE));
		imageLoader.ShowImage(list.get(NextActivity.TAG_LINK_IMAGE),iv);

		return v;
Последний раз редактировалось mdzht 26 янв 2014, 12:34, всего редактировалось 1 раз.
«Life is too short to spend rewriting code»

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Как организовать общие переменные и функции?

Сообщение altwin » 26 янв 2014, 12:34

mdzht писал(а):Привет коллеги! Не могу сообразить, уже месяц бьюсь головой об стену. Необходимо передать ключи по нажатию кнопки.
В первом классе MainActivity.java

Код: Выделить всё

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.btn:

			Intent i = new Intent(MainActivity.this,
					NextActivity.class);
			i.putExtra("name", txtNameId.getText().toString());
			i.putExtra("link_image",
					txtLinkImage.getText().toString());
			startActivity(i);

			break;
                 }
        }
NextActivity.java

Код: Выделить всё

  
        public String TAG_NAME_ID;  // Если тут же приписывать то все работает отлично, но у меня в MainActivty не один button, а несколько
	public String TAG_LINK_IMAGE; // public static final String TAG_NAME_ID="name";
        @Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.list_myapp);
                
                Intent i = getIntent();
		
                TAG_NAME_ID = i.getStringExtra("name");
		TAG_LINK_IMAGE = i.getStringExtra("link_image");
                 .......
               }
           ......
	protected String doInBackground(String... args) {
      ...
        String txt_name = c.getString(TAG_NAME_ID);
	String rus_detail_text_image_k = c.getString(TAG_LINK_IMAGE);    
        }

в адаптере ListAdapter.java

Код: Выделить всё

      public ImageLoader imageLoader;
        ......
        public View getView(int position, View convertView, ViewGroup parent) {
		View v = convertView;
		if (convertView == null)
			v = inflater.inflate(R.layout.item_list, null);		
		
                TextView name = (TextView) v.findViewById(R.id.name);
		TextView link_image = (TextView) v.findViewById(R.id.link_image);
                ImageView iv = (ImageView) v.findViewById(R.id.image);
	        
                HashMap<String, String> list = new HashMap<String, String>();
		list  = data.get(position);
		
                name.setText(list.get(NextKitchenActivity.TAG_NAME_ID));
		link_image.setText(list.get(NextKitchenActivity.TAG_LINK_IMAGE));
		imageLoader.ShowImage(list.get(NextActivity.TAG_LINK_IMAGE),iv);

		return v;
если честно вопроса не понял, и читать не форматированный код не удобно. Если хотите присвоить значение в зависимости от нажатой кнопки, используйте switch(v.getId) и по id кнопки выполняйте присваивание строке. Если нужно передать в другую activity значения используйте сериализацию.
P.S. с форматированный кодом проще. :) Когда вы создаете intent вам нужно вызвать его метод putExtra, и передать туда сериализованный объект. Сутя по списку уроков - тут это описанно: http://startandroid.ru/ru/uroki/vse-uro ... hju-intent
Изображение

Аватара пользователя
mdzht
Сообщения: 124
Зарегистрирован: 11 ноя 2013, 11:33
Откуда: fock it
Контактная информация:

Re: Как организовать общие переменные и функции?

Сообщение mdzht » 26 янв 2014, 12:52

Ну я так и делаю, i.putExtra("name", txtNameId.getText().toString()); и хочу получить TAG_NAME_ID = i.getStringExtra("name"); а получаю хрень
«Life is too short to spend rewriting code»

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Как организовать общие переменные и функции?

Сообщение altwin » 26 янв 2014, 13:02

mdzht писал(а):Ну я так и делаю, i.putExtra("name", txtNameId.getText().toString()); и хочу получить TAG_NAME_ID = i.getStringExtra("name"); а получаю хрень
а если вместо getStringExtra()? использовать getString()? Хотя должно работать итак, вопрос в том, хрень , которую вы получаете - это что?
по сути должно работать:
[syntax=java5]
Intent intent= getIntent();
String receiver;
if(intent.hasExtra("name")){
receiver = intent.getStringExtra("name");
}
[/syntax]
если же туда пришло что то не то, то соответственно что то не то туда было положенно.
Изображение

Аватара пользователя
mdzht
Сообщения: 124
Зарегистрирован: 11 ноя 2013, 11:33
Откуда: fock it
Контактная информация:

Re: Как организовать общие переменные и функции?

Сообщение mdzht » 26 янв 2014, 14:37

Да вы были правы, неправильно делал. Я делаю так
MainActivity.java

Код: Выделить всё

 @Override
	   public void onClick(View v) {	
           switch (v.getId()) {
		case R.id.btn1:
		
			Intent i = new Intent(MainActivity.this,
					NextActivity.class);
			i.putExtra("name1",TAG_TEXT_NAME_1);
			i.putExtra("image1",TAG_LINK_IMAGE_1);
			startActivity(i);

			break;
		case R.id.btn2n:
			Intent i = new Intent(MainActivity.this,
					NextActivity.class);
			i.putExtra("name2", TAG_TEXT_NAME_2);
			i.putExtra("image2",TAG_LINK_IMAGE_2);
			startActivity(i);
			break;
		case R.id.btn3:
			Intent i = new Intent(MainActivity.this,
					NextActivity.class);
			i.putExtra("name3", TAG_TEXT_NAME_3);
			i.putExtra("image3",TAG_LINK_IMAGE_3);
			startActivity(i);
			break;
NextActivity.java

Код: Выделить всё

 if(i.hasExtra("name1") && i.hasExtra("image1")){
			 TAG_NAME_ID = i.getStringExtra("name1");
			 TAG_LINK_IMAGE = i.getStringExtra("image1");
		    }
		 else if (i.hasExtra("name2") && i.hasExtra("image2")){
			  TAG_NAME_ID = i.getStringExtra("name2");
			 TAG_LINK_IMAGE = i.getStringExtra("image2");
		    }
		 else if (i.hasExtra("name3") && i.hasExtra("image3")){
			 TAG_NAME_ID = i.getStringExtra("name3");
			 TAG_LINK_IMAGE = i.getStringExtra("image3");
		    }
но только первая кнопка работает, остальные грузят пустые страницы
«Life is too short to spend rewriting code»

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Как организовать общие переменные и функции?

Сообщение altwin » 26 янв 2014, 15:14

mdzht писал(а):Да вы были правы, неправильно делал. Я делаю так
MainActivity.java

Код: Выделить всё

 @Override
	   public void onClick(View v) {	
           switch (v.getId()) {
		case R.id.btn1:
		
			Intent i = new Intent(MainActivity.this,
					NextActivity.class);
			i.putExtra("name1",TAG_TEXT_NAME_1);
			i.putExtra("image1",TAG_LINK_IMAGE_1);
			startActivity(i);

			break;
		case R.id.btn2n:
			Intent i = new Intent(MainActivity.this,
					NextActivity.class);
			i.putExtra("name2", TAG_TEXT_NAME_2);
			i.putExtra("image2",TAG_LINK_IMAGE_2);
			startActivity(i);
			break;
		case R.id.btn3:
			Intent i = new Intent(MainActivity.this,
					NextActivity.class);
			i.putExtra("name3", TAG_TEXT_NAME_3);
			i.putExtra("image3",TAG_LINK_IMAGE_3);
			startActivity(i);
			break;
NextActivity.java

Код: Выделить всё

 if(i.hasExtra("name1") && i.hasExtra("image1")){
			 TAG_NAME_ID = i.getStringExtra("name1");
			 TAG_LINK_IMAGE = i.getStringExtra("image1");
		    }
		 else if (i.hasExtra("name2") && i.hasExtra("image2")){
			  TAG_NAME_ID = i.getStringExtra("name2");
			 TAG_LINK_IMAGE = i.getStringExtra("image2");
		    }
		 else if (i.hasExtra("name3") && i.hasExtra("image3")){
			 TAG_NAME_ID = i.getStringExtra("name3");
			 TAG_LINK_IMAGE = i.getStringExtra("image3");
		    }
но только первая кнопка работает, остальные грузят пустые страницы
Если одна работает, то в остальных нужно просто сделать все также. Возможно там не указан listener, т.е. события нажатия обрабатываются, но сам обработчик к кнопкам не привязан.
Изображение

Аватара пользователя
mdzht
Сообщения: 124
Зарегистрирован: 11 ноя 2013, 11:33
Откуда: fock it
Контактная информация:

Re: Как организовать общие переменные и функции?

Сообщение mdzht » 26 янв 2014, 15:20

Но в чем прикол ребята, если в NextActivity.java оставить только первый if т.е

Код: Выделить всё

 if(i.hasExtra("name1") && i.hasExtra("image1")){ 
             TAG_NAME_ID = i.getStringExtra("name1"); 
             TAG_LINK_IMAGE = i.getStringExtra("image1"); 
            } 
все кнопки работают и все они работают как должна работать первая кнопка. Не могу понять почему остальные кнопки работают хотя в них вставлю

Код: Выделить всё

 i.putExtra("name2", TAG_TEXT_NAME_2); 

  i.putExtra("name3", TAG_TEXT_NAME_3); 
«Life is too short to spend rewriting code»

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Как организовать общие переменные и функции?

Сообщение altwin » 26 янв 2014, 15:33

mdzht писал(а):Но в чем прикол ребята, если в NextActivity.java оставить только первый if т.е

Код: Выделить всё

 if(i.hasExtra("name1") && i.hasExtra("image1")){ 
             TAG_NAME_ID = i.getStringExtra("name1"); 
             TAG_LINK_IMAGE = i.getStringExtra("image1"); 
            } 
все кнопки работают и все они работают как должна работать первая кнопка. Не могу понять почему остальные кнопки работают хотя в них вставлю

Код: Выделить всё

 i.putExtra("name2", TAG_TEXT_NAME_2); 

  i.putExtra("name3", TAG_TEXT_NAME_3); 
Когда выполняется условие case: id.btn, для какой то кнопки, выполняется его код, в котором вы и передаете значение из editText в extra. То какой кнопкой вы запускаете intent не имеет значение если содержимое editText не меняется. Значение которое вы получаете в точности соответствует тому, которое вы передаете, если приходит одно и то же, то вы передаете во всех случаях одно и то же.
Изображение

Аватара пользователя
mdzht
Сообщения: 124
Зарегистрирован: 11 ноя 2013, 11:33
Откуда: fock it
Контактная информация:

Re: Как организовать общие переменные и функции?

Сообщение mdzht » 26 янв 2014, 15:44

Но я не из editText а передаю значение. Я передаю case btn1: public static final TAG_TEXT_NAME_1 = "name1"; case btn2: public static final TAG_TEXT_NAME_2 = "name2"; и так далее, listener для них всех один. ListAdapter тоже, приложение работала бы если бы я создал для них каждого отдельные Activity, отдельный ListAdapter отдельные layout.xml но это уж очень не красиво. Если бы я мог передать по нажатию кнопки начения для следующего activity static final теги для массива php $row = mysql_fetch_array($result), то все бы работала отлично. Думаю этот код

Код: Выделить всё

 if(i.hasExtra("rname") || i.hasExtra("rimage")){
			 TAG_TEXT_NAME = i.getStringExtra("rname");
			 TAG_LINK_IMAGE_KITCHEN = i.getStringExtra("rimage");
		    }
		 else if (i.hasExtra("iname") || i.hasExtra("iimage")){
			 TAG_TEXT_NAME = i.getStringExtra("iname");
			 TAG_LINK_IMAGE_KITCHEN = i.getStringExtra("iimage");
		    }
		 else if (i.hasExtra("gname") || i.hasExtra("gimage")){
			 TAG_TEXT_NAME = i.getStringExtra("gname");
			 TAG_LINK_IMAGE_KITCHEN = i.getStringExtra("gimage");
		    }
не так работает как я хотел
«Life is too short to spend rewriting code»

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Как организовать общие переменные и функции?

Сообщение altwin » 26 янв 2014, 15:59

mdzht писал(а):не так работает как я хотел
Чтобы контролировать то, как оно работает, вам нужно к примеру создать класс: class Names implements serializable и переопределить конструктор и toString, как и любой другой метод, и получать вы будете то, что возвращается при десериализации. Вы просто создаете объекты этого класса, в которых хранятся нужные вам имена и полностью контролируете процесс.
Последний раз редактировалось altwin 26 янв 2014, 16:10, всего редактировалось 1 раз.
Изображение

Аватара пользователя
mdzht
Сообщения: 124
Зарегистрирован: 11 ноя 2013, 11:33
Откуда: fock it
Контактная информация:

Re: Как организовать общие переменные и функции?

Сообщение mdzht » 26 янв 2014, 16:03

altwin Большая человеческая благодарность вам, вы были правы, все работает отлично. Просто для других кнопок я неправильные значения передавал, т.е ошибки были в значениях а ни в

Код: Выделить всё

 if(i.hasExtra("rname") || i.hasExtra("rimage")){ 
                 TAG_TEXT_NAME = i.getStringExtra("rname"); 
                 TAG_LINK_IMAGE_KITCHEN = i.getStringExtra("rimage"); 
                } 
             else if (i.hasExtra("iname") || i.hasExtra("iimage")){ 
                 TAG_TEXT_NAME = i.getStringExtra("iname"); 
                 TAG_LINK_IMAGE_KITCHEN = i.getStringExtra("iimage"); 
                } 
             else if (i.hasExtra("gname") || i.hasExtra("gimage")){ 
                 TAG_TEXT_NAME = i.getStringExtra("gname"); 
                 TAG_LINK_IMAGE_KITCHEN = i.getStringExtra("gimage"); 
                } 
Последний раз редактировалось mdzht 26 янв 2014, 16:13, всего редактировалось 1 раз.
«Life is too short to spend rewriting code»

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Как организовать общие переменные и функции?

Сообщение altwin » 26 янв 2014, 16:11

mdzht писал(а):altwin Большая человеческая благодарность вам, вы были правы, все работает отлично. Просто для других кнопок я неправильные значения передавал, т.е ошибки были а значениях а ни в

Код: Выделить всё

 if(i.hasExtra("rname") || i.hasExtra("rimage")){ 
                 TAG_TEXT_NAME = i.getStringExtra("rname"); 
                 TAG_LINK_IMAGE_KITCHEN = i.getStringExtra("rimage"); 
                } 
             else if (i.hasExtra("iname") || i.hasExtra("iimage")){ 
                 TAG_TEXT_NAME = i.getStringExtra("iname"); 
                 TAG_LINK_IMAGE_KITCHEN = i.getStringExtra("iimage"); 
                } 
             else if (i.hasExtra("gname") || i.hasExtra("gimage")){ 
                 TAG_TEXT_NAME = i.getStringExtra("gname"); 
                 TAG_LINK_IMAGE_KITCHEN = i.getStringExtra("gimage"); 
                } 
так бывает часто, потому, лучше просто не торопиться и быть внимательнее. Ответ выше я изменил, чтобы было понятно, что можно передавать объект в котором полностью контролировать процесс, не надеясь на поведение по умолчанию.
Изображение

Ответить