Урок 28. Extras - передаем данные с помощью Intent

Обсуждение уроков
Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 28. Extras - передаем данные с помощью Intent

Сообщение KamiSempai » 16 янв 2015, 13:08

Конструктор Activity это:
[syntax=java]public Activity() {
...
}[/syntax]
Его можно перегрузить, но вы не можете добавлять в него свои параметры.

Конструктор без параметров позволяет сделать следующую хитрость:
[syntax=java]Class activtyClass = MyActivity.class.
Activity activity = activtyClass.newInstance();[/syntax]Собственно, система такой хитростью и пользуется. И не только для Activity но и для Fragment, Service, BroadcastReceiver и многих других.

Замечание! Activity не должна иметь конструктор с параметрами.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

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

Re: Урок 28. Extras - передаем данные с помощью Intent

Сообщение altwin » 16 янв 2015, 13:14

Fry писал(а):
Вот у Активити ведь конструктор
Вы в этом уверенны ? :)
Изображение

Аватара пользователя
Fry
Сообщения: 183
Зарегистрирован: 07 дек 2013, 22:07

Re: Урок 28. Extras - передаем данные с помощью Intent

Сообщение Fry » 16 янв 2015, 13:57

altwin писал(а): Вот у Активити ведь конструктор
Вы в этом уверенны ? :)
Это ж класс :)

Не знаю правда, как активити вызвать без интента, а он на вход принимает не объект а класс )
Arbeit macht Fry

Аватара пользователя
Fry
Сообщения: 183
Зарегистрирован: 07 дек 2013, 22:07

Re: Урок 28. Extras - передаем данные с помощью Intent

Сообщение Fry » 16 янв 2015, 14:04

KamiSempai писал(а): Его можно перегрузить, но вы не можете добавлять в него свои параметры.
Это интересно )

[syntax=java]Activity activity = activtyClass.newInstance();[/syntax]

У меня вызывает ошибку.

Error:(43, 53) error: incompatible types: Object cannot be converted to Activity

ЗЫ. Если удастся так сделать, можно ведь задействовать сеттеры для передачи данных в объект активити. Опять таки - любые данные без заморочек :)
Arbeit macht Fry

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

Re: Урок 28. Extras - передаем данные с помощью Intent

Сообщение altwin » 16 янв 2015, 14:11

Fry писал(а):
altwin писал(а): Вот у Активити ведь конструктор
Вы в этом уверенны ? :)
Это ж класс :)
Собственно все ответы тут: https://github.com/android/platform_fra ... .java#L660

ну а интент.. это же всеголишь интент и он тут: https://github.com/android/platform_fra ... .java#L814

Activity -это действительно просто класс содержащий логику о порядке вызова методов + инициализирующий переменные. Я вообще давно об этом не думал и не обращал внимание, но мне проще думать, что у Activity - нет конструктора.

Если честно я не особо помню, но если не ошибаюсь сам контекст формируется тут: https://github.com/android/platform_fra ... .java#L669 , ну а остальное - просто цепочка методов, т.е. даже если бы у Activity и был конструктор - переобпределять его бесполезно, т.к. во первых объект не создается, во вторых он всеравно не будет задействован в цепочке инициализации.
Изображение

RuslanLion
Сообщения: 6
Зарегистрирован: 14 май 2015, 21:48

Re: Урок 28. Extras - передаем данные с помощью Intent

Сообщение RuslanLion » 20 июн 2015, 13:46

Поскажите что не так в коде. Заранее спасибо.

мейн
package ua.lion.extrasint;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;


public class MainActivity extends Activity implements View.OnClickListener {

TextView tv;
Button btn;
int num;




@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

tv = (TextView) findViewById(R.id.textView);
btn = (Button) findViewById(R.id.button);
btn.setOnClickListener(this);

num = 5;








}



@Override
public void onClick(View v) {
Intent inp = new Intent(this, Calc.class);
inp.putExtra("inter", num);
startActivity(inp);



}
}

второй активити
package ua.lion.extrasint;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;


public class Calc extends Activity {

TextView tv2;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_calc);

tv2 = (TextView)findViewById(R.id.tv2);

Intent intent = getIntent();

int number = intent.getIntExtra("inter", 0);
tv2.setText(number);

}


}
Последний раз редактировалось RuslanLion 21 июн 2015, 15:38, всего редактировалось 1 раз.

Аватара пользователя
Sympathy
Сообщения: 42
Зарегистрирован: 14 июн 2015, 19:50

Re: Урок 28. Extras - передаем данные с помощью Intent

Сообщение Sympathy » 20 июн 2015, 16:37

Горячая тема.. ух
может кто подскажет, как открыть приложение "стандартные заметки" из своего приложения

lazyroot
Сообщения: 6
Зарегистрирован: 10 июл 2015, 17:48

Re: Урок 28. Extras - передаем данные с помощью Intent

Сообщение lazyroot » 10 июл 2015, 17:52

Добрый день.
Данный вопрос уже неоднократно звучал в этой ветке, но я чего-то недопонял...
У меня не получается передать int из одного activity в другой.
[syntax=java]
package ua.pp.dreamer.rent.v1;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends ActionBarActivity implements OnClickListener {

EditText Mounth_input;
EditText Year_input;
EditText RentPay_input;
EditText ELimit_input;
EditText ELowPrice_input;
EditText EHiPrice_input;
EditText EPrevious_input;
EditText ECurrent_input;
EditText WPrice_input;
EditText WPrevious_input;
EditText WCurrent_input;
EditText Heating_input;
EditText Debt_input;

Button button_calc;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Mounth_input = (EditText) findViewById(R.id.Mounth_input);
Year_input = (EditText) findViewById(R.id.Year_input);
RentPay_input = (EditText) findViewById(R.id.RentPay_input);
ELimit_input = (EditText) findViewById(R.id.ELimit_input);
ELowPrice_input = (EditText) findViewById(R.id.ELowPrice_input);
EHiPrice_input = (EditText) findViewById(R.id.EHiPrice_input);
EPrevious_input = (EditText) findViewById(R.id.EPrevious_input);
ECurrent_input = (EditText) findViewById(R.id.ECurrent_input);
WPrice_input = (EditText) findViewById(R.id.WPrice_input);
WPrevious_input = (EditText) findViewById(R.id.WPrevious_input);
WCurrent_input = (EditText) findViewById(R.id.WCurrent_input);
Heating_input = (EditText) findViewById(R.id.Heating_input);
Debt_input = (EditText) findViewById(R.id.Debt_input);

button_calc = (Button) findViewById(R.id.button_calc);
button_calc.setOnClickListener(this);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}

public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent (this, CalcActivity.class);

intent.putExtra("Mounth_input", Mounth_input.getText().toString());
intent.putExtra("Year_input", Year_input.getText().toString());
intent.putExtra("RentPay_input", RentPay_input.getText().toString());
intent.putExtra("ELimit_input", ELimit_input.getText().toString());
intent.putExtra("ELowPrice_input", ELowPrice_input.getText().toString());
intent.putExtra("EHiPrice_input", EHiPrice_input.getText().toString());
intent.putExtra("EPrevious_input", EPrevious_input.getText().toString());
intent.putExtra("ECurrent_input", ECurrent_input.getText().toString());
intent.putExtra("WPrice_input", WPrice_input.getText().toString());
intent.putExtra("WPrevious_input", WPrevious_input.getText().toString());
intent.putExtra("WCurrent_input", WCurrent_input.getText().toString());
intent.putExtra("Heating_input", Heating_input.getText().toString());
intent.putExtra("Debt_input", Debt_input.getText().toString());

startActivity(intent);
}
}

[/syntax]

Вот со String работает а с int нет.
Отличие в строке 42

[syntax=java]
package ua.pp.dreamer.rent.v1;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;

public class CalcActivity extends Activity {

TextView Top_txt;
TextView ECalc;
TextView EWater;
TextView Heating;
TextView Debt;
TextView Calc_show;
TextView Calc_total;

protected void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_calc);

Top_txt = (TextView) findViewById(R.id.Top_txt);
ECalc = (TextView) findViewById(R.id.ECalc);
EWater = (TextView) findViewById(R.id.EWater);
Heating = (TextView) findViewById(R.id.Heating);
Debt = (TextView) findViewById(R.id.Debt);
Calc_show = (TextView) findViewById(R.id.Calc_show);
Calc_total = (TextView) findViewById(R.id.Calc_total);

Intent intent = getIntent();


String Mounth_input = intent.getStringExtra("Mounth_input");
String Year_input = intent.getStringExtra("Year_input");
String RentPay_input = intent.getStringExtra("RentPay_input");
String ELimit_input = intent.getStringExtra("ELimit_input");
String ELowPrice_input = intent.getStringExtra("ELowPrice_input");
String EHiPrice_input = intent.getStringExtra("EHiPrice_input");
String EPrevious_input = intent.getStringExtra("EPrevious_input");
String ECurrent_input = intent.getStringExtra("ECurrent_input");
String WPrice_input = intent.getStringExtra("WPrice_input");
int WPrevious_input = intent.getIntExtra("WPrevious_input", 0);
String WCurrent_input = intent.getStringExtra("WCurrent_input");
String Heating_input = intent.getStringExtra("Heating_input");
String Debt_input = intent.getStringExtra("Debt_input");


Top_txt.setText("Rent For " + Mounth_input + " " + Year_input + " ");
ECalc.setText("");
EWater.setText("");
Heating.setText(Heating_input);
Debt.setText(Debt_input);
Calc_show.setText("");
Calc_total.setText(WPrevious_input);

}

}

[/syntax]

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Урок 28. Extras - передаем данные с помощью Intent

Сообщение klblk » 13 июл 2015, 07:39

lazyroot писал(а):Добрый день.
...
Судя по коду вы отправляете String и пытаетесь получить int. Так ничего не получится.
Подсказка: http://developer.android.com/intl/ru/re ... ng.String)

lazyroot
Сообщения: 6
Зарегистрирован: 10 июл 2015, 17:48

Re: Урок 28. Extras - передаем данные с помощью Intent

Сообщение lazyroot » 13 июл 2015, 10:44

Я понимаю что проблема в этой строке
[syntax=java]intent.putExtra("WPrevious_input", WPrevious_input.getText().toString());[/syntax]
При изменении на это - выдает ошибку
[syntax=java]intent.parseInt("WPrevious_input", WPrevious_input.getText().toString());[/syntax]
Делаю так:
[syntax=java]intent.parseInt("WPrevious_input", WPrevious_input);[/syntax]
По прежнему ошибка.
Eclipse предлагает так:
[syntax=java]((Object) intent).parseInt("WPrevious_input", WPrevious_input);[/syntax]
но не понимаю что прописать вместо "Object".

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Урок 28. Extras - передаем данные с помощью Intent

Сообщение doter.ua » 13 июл 2015, 11:00

По-вашему, Intent и Integer это одно и тоже?
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

lazyroot
Сообщения: 6
Зарегистрирован: 10 июл 2015, 17:48

Re: Урок 28. Extras - передаем данные с помощью Intent

Сообщение lazyroot » 13 июл 2015, 11:23

doter.ua писал(а):По-вашему, Intent и Integer это одно и тоже?
Нет.

Я понимаю что здесь все с многолетним опытом программирования и всем очевидна моя ошибка, но я не имею опыта, а только начинаю и прошу помощи.
Не понимаю я на что Вы хотите меня направить.
Если вопрос слишком глуп - так и скажите и я попытаю счастье на других форумах.
Спасибо за понимание.

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Урок 28. Extras - передаем данные с помощью Intent

Сообщение doter.ua » 13 июл 2015, 11:42

lazyroot писал(а):
doter.ua писал(а):По-вашему, Intent и Integer это одно и тоже?
Нет.

Я понимаю что здесь все с многолетним опытом программирования и всем очевидна моя ошибка, но я не имею опыта, а только начинаю и прошу помощи.
Не понимаю я на что Вы хотите меня направить.
Если вопрос слишком глуп - так и скажите и я попытаю счастье на других форумах.
Спасибо за понимание.
Сравни:
intent.parseInt("WPrevious_input", WPrevious_input);
и
Integer.parseInt("123", 10); //( число в строке, основание системы счисления (десятичная двоичная и т.д.) )
Integer - с англ. целое число.
З.Ы. второй параметр по дефолту итак 10
int myNum = Integer.parseInt("123"); // myNum = 123
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

lazyroot
Сообщения: 6
Зарегистрирован: 10 июл 2015, 17:48

Re: Урок 28. Extras - передаем данные с помощью Intent

Сообщение lazyroot » 13 июл 2015, 12:03

Получающий activity получает в таком виде? Я правильно понял?
[syntax=java]int WPrevious_input = Integer.parseInt("WPrevious_input", 10);[/syntax]
А в передающем мы должны что-то менять? Я правильно понял, передаем мы строку а не целое число а вытянуть пытаемся целое число?
[syntax=java]intent.putExtra("WPrevious_input", WPrevious_input.getText().toString());[/syntax]
По идее мы же и передать и вытянуть должны один тип данных...

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Урок 28. Extras - передаем данные с помощью Intent

Сообщение doter.ua » 13 июл 2015, 12:26

Почему бы не класть в интент число? сразу на месте распарсить его.

отправляющий:

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

int num = Integer.parseInt( WPrevious_input.getText().toString() );
intent.putExtra("myKey",  num );
Получающий:

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

int defaultValue = 0;
int num = getIntent().getExtras().getInt( "myKey", defaultValue );
ЗЫ проверки интента на null и прочее пропустил для простоты примера.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

lazyroot
Сообщения: 6
Зарегистрирован: 10 июл 2015, 17:48

Re: Урок 28. Extras - передаем данные с помощью Intent

Сообщение lazyroot » 13 июл 2015, 14:52

Битый час бьюсь и не могу понять в чем же проблема...
Упростил программу до невозможности...
Выкладываю все, может кто-то что-то заметит...
activity_main.xml
[syntax=java]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<ScrollView
android:id="@+id/scrollView1"
android:layout_width="match_parent"
android:layout_height="wrap_content" >

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center_horizontal" >

<TextView
android:id="@+id/txt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Pype int here" />

<EditText
android:id="@+id/input"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="number"
android:ems="10"
android:text="3"
android:gravity="center_horizontal" >

<requestFocus />
</EditText>

</LinearLayout>

</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >

<Button
android:id="@+id/calc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Calculate" />

</LinearLayout>

</LinearLayout>

</ScrollView>

</LinearLayout>

[/syntax]
activity_calc.xml
[syntax=java]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<ScrollView
android:id="@+id/scrollView1"
android:layout_width="match_parent"
android:layout_height="wrap_content" >

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >

<TextView
android:id="@+id/Top_txt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Output "
android:gravity="center_horizontal"
android:textAppearance="?android:attr/textAppearanceLarge" />

</LinearLayout>


<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >

<TextView
android:id="@+id/Calc_show"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="3"
android:text=""
android:gravity="center_horizontal"
android:textAppearance="?android:attr/textAppearanceLarge" />

</LinearLayout>

</LinearLayout>

</ScrollView>

</LinearLayout>

[/syntax]
MainActivity.class
[syntax=java]
package com.example.int_test;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends ActionBarActivity implements OnClickListener {


EditText input_int;

Button button_calc;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

input_int = (EditText) findViewById(R.id.input);

button_calc = (Button) findViewById(R.id.calc);
button_calc.setOnClickListener(this);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}

public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent (this, CalcActivity.class);

int num = Integer.parseInt( input_int.getText().toString() );
intent.putExtra("myKey", num );

startActivity(intent);
}
}

[/syntax]
CalcActivity.class
[syntax=java]
package com.example.int_test;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class CalcActivity extends Activity {

TextView Top_txt;
TextView Calc_show;

protected void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_calc);

Top_txt = (TextView) findViewById(R.id.Top_txt);
Calc_show = (TextView) findViewById(R.id.Calc_show);

int defaultValue = 0;
int num = getIntent().getExtras().getInt( "myKey", defaultValue );

Calc_show.setText(num);

}

}

[/syntax]

Sasha2dx
Сообщения: 51
Зарегистрирован: 10 апр 2015, 23:24

Re: Урок 28. Extras - передаем данные с помощью Intent

Сообщение Sasha2dx » 14 июл 2015, 01:08

Хз-хз.
Последний раз редактировалось Sasha2dx 14 июл 2015, 09:06, всего редактировалось 1 раз.

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Урок 28. Extras - передаем данные с помощью Intent

Сообщение klblk » 14 июл 2015, 07:58

lazyroot писал(а):Битый час бьюсь и не могу понять в чем же проблема...
[syntax=java]Calc_show.setText(num + "");[/syntax]

lazyroot
Сообщения: 6
Зарегистрирован: 10 июл 2015, 17:48

Re: Урок 28. Extras - передаем данные с помощью Intent

Сообщение lazyroot » 14 июл 2015, 15:03

Ну то, что это работает я уже убедился) Спасибо Всем что помогли. Но почему я не могу просто вывести число, зачем добавлять + "" я чуть-чуть не понял...
klblk писал(а):[syntax=java]Calc_show.setText(num + "");[/syntax]
Вдогонку родился еще один вопрос, а как передать float или double?
В чем будут отличия?

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Урок 28. Extras - передаем данные с помощью Intent

Сообщение klblk » 15 июл 2015, 06:04

lazyroot писал(а):Ну то, что это работает я уже убедился) Спасибо Всем что помогли. Но почему я не могу просто вывести число, зачем добавлять + "" я чуть-чуть не понял...
Потому что есть 2 метода setText(). Один на вход принимает строку (String), другой на вход принимает id ресурса (int, например: R.string.mystring, где mystring строка в ресурсах xml). Вы передавали в метод свой num, который int, и система пытается найти ресурс с таким id, и естественно не находит и вылетает с ошибкой.
num + "" - простейший способ преобразовать число в строку. С float и double можно поступать также, правда я не помню сколько он в таком случае выведет знаков после запятой, для них есть более деликатные способы вывода.

Ответить