Урок 30. Подробнее про onActivityResult. Зачем нужны requestCode и resultCode

Обсуждение уроков
gad007
Сообщения: 10
Зарегистрирован: 06 фев 2013, 20:47

Re: Урок 30. Подробнее про onActivityResult. Зачем нужны req

Сообщение gad007 » 07 фев 2013, 00:30

большое спасибо.

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Урок 30. Подробнее про onActivityResult. Зачем нужны req

Сообщение neoksi » 14 апр 2013, 08:07

ophiucus писал(а):Народ помогите, либо лыжи не едут либо я ...... :shock:
суть проблемы: делаю свой проект и наткнулся на странную вещь onActivityResult вызывается сразу после startActivityForResult еще до закрытия дочерней активити и после закрытия дочерней активити больше не вызывается, соответственно никаких результатов от дочерней активити я не получаю. Думал намудрил что-то в своем коде, зашел сюда, взял этот урок, создал новый проект запускаю и ..., после нажатия кнопки Color или Alignment всплывает тоаст Wrong result, хотя я еще никаких кнопок на дочерней активити не нажимал и соответственно после нажатия и закрытия дочерней активити ни цвет ни выравнивание ни изменяются, та же история что и у меня в проекте onActivityResult вызывается сразу после startActivityForResult. Что интересно такое и на планшете и на эмуляторе.

Что это может быть и как от этого лечится?
Вот и я вчера попался на это, были у меня активности в SingleInstance. Только сегодня понял, что в этом параметре дело.
Теперь думаю, как эмулировать сделать SingleInstance в Standart режиме.
Может кто подскажет решение?

Грино
Сообщения: 12
Зарегистрирован: 30 май 2013, 12:27

Re: Урок 30. Подробнее про onActivityResult. Зачем нужны req

Сообщение Грино » 31 май 2013, 07:44

Про манифест файл забыл написать в уроке

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

Re: Урок 30. Подробнее про onActivityResult. Зачем нужны req

Сообщение damager82 » 31 май 2013, 16:11

Грино писал(а):Про манифест файл забыл написать в уроке
Что конкретно?
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

assan
Сообщения: 48
Зарегистрирован: 24 мар 2013, 22:31

Re: Урок 30. Подробнее про onActivityResult. Зачем нужны req

Сообщение assan » 15 июл 2013, 18:42

может не совсем по уроку...
есть activity Main, из неё вызываю activity ServicePage1 так

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

Intent intent = new Intent(this, ServicePage1.class);
 startActivityForResult(intent, 1);
в activity ServicePage1 вызываю activity ServicePage2

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

intent = new Intent(this, ServicePage2.class);
startActivity(intent);
из activity ServicePage2 нужно вернуться activity Main, и надо передать что-то в неё
как это можно сделать?

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: Урок 30. Подробнее про onActivityResult. Зачем нужны req

Сообщение anber » 15 июл 2013, 19:06

assan писал(а):может не совсем по уроку...
есть activity Main, из неё вызываю activity ServicePage1 так

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

Intent intent = new Intent(this, ServicePage1.class);
 startActivityForResult(intent, 1);
в activity ServicePage1 вызываю activity ServicePage2

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

intent = new Intent(this, ServicePage2.class);
startActivity(intent);
из activity ServicePage2 нужно вернуться activity Main, и надо передать что-то в неё
как это можно сделать?
Тут есть несколько вариантов.
1) К примеру можно что-то типа у Main в манифесте прописать android:launchMode="singleInstance" и если ее запустить из ServicePage2 типа new Intent(this, Main.class); вызовется не новая а уже существующая, и в интент можно положить какие-нибудь данные. Если к тому же прописать этому интенту что-то типа FLAG_ACTIVITY_CLEAR_TOP то оно заодно удалит из стека ServicePage1 чтоб по back на него не возвращалось.
2) Сделать лесенку - ServicePage2 возвращает в ServicePage1 результат, а ServicePage1 закрывается и пересылает его Main

ну это так, на вскидку, я счас не за компом нет возможности проверить
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

assan
Сообщения: 48
Зарегистрирован: 24 мар 2013, 22:31

Re: Урок 30. Подробнее про onActivityResult. Зачем нужны req

Сообщение assan » 15 июл 2013, 20:47

anber писал(а): 1) К примеру можно что-то типа у Main в манифесте прописать android:launchMode="singleInstance" и если ее запустить из ServicePage2 типа new Intent(this, Main.class); вызовется не новая а уже существующая, и в интент можно положить какие-нибудь данные. Если к тому же прописать этому интенту что-то типа FLAG_ACTIVITY_CLEAR_TOP то оно заодно удалит из стека ServicePage1 чтоб по back на него не возвращалось.
что-то странное. При вызове activity ServicePage1 из Main, происходит сработка в Main onActivityResult, хотя она должна срабатывать при возврате в Main.
и и соответственно ничего не передается(не возвращается из ServicePage2)
но в savedInstanceState данные сохраненные onSaveInstanceState, остаются, чего не было без android:launchMode="singleInstance" это хорошо, но не достаточно
проверь, у себя, мож я что не так , или так и должно...

vozup
Сообщения: 9
Зарегистрирован: 23 июл 2013, 20:16

Re: Урок 30. Подробнее про onActivityResult. Зачем нужны req

Сообщение vozup » 23 июл 2013, 20:26

Здравствуйте, у меня такая проблема. Делаю все точно как в уроке, но из 2го активити не возвращяется результат(в setResult результат заносится).
Вот код MainActivity

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

protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		btnLeft = (Button) findViewById(R.id.btnLeft);
		btnRight = (Button) findViewById(R.id.btnRight);
	}
public boolean onOptionsItemSelected(MenuItem item)//выбранный пункт меню
	{
		switch(item.getItemId())
		{
		case R.id.action_settings:
			Intent intent = new Intent(this, SettingsActivity.class);
			startActivityForResult(intent, REQUEST_CODE_SETTINGS);
			break;
		}
		
		return super.onOptionsItemSelected(item);
	}
public void OnActivityResult(int requestCode, int resultCode, Intent data)
	{
		String sData;
		sData  = data.getExtras().toString();
		int checkBox = 0;
		if(sData == "Left") checkBox=1;
		if(sData == "Right") checkBox=2;
		if(resultCode == RESULT_OK)
		{
			switch(requestCode)
			{
			case REQUEST_CODE_SETTINGS:
				{
				switch(checkBox)
					{
					case 1:
						btnLeft.setActivated(true);
					break;
					case 2:
						btnRight.setActivated(true);
					break;
					}
			    }
				break;
			}
		}
		else Toast.makeText(this, "Error", Toast.LENGTH_SHORT).show();
	}
Вот код SettingsActivity

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

public class SettingsActivity extends Activity implements OnClickListener {
	
	Button btnApplySettings;
	CheckBox cbBtnLeft, cbBtnRight;
	
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.settings);
		
		btnApplySettings = (Button) findViewById(R.id.btnApplySettings);
		btnApplySettings.setOnClickListener(this);
		cbBtnLeft = (CheckBox) findViewById(R.id.cbBtnLeft);
		cbBtnRight = (CheckBox) findViewById(R.id.cbBtnRight);
		
	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		Intent intent = new Intent();
		if (cbBtnLeft.isChecked()) intent.putExtra("CheckBox","Left");
		if (cbBtnRight.isChecked()) intent.putExtra("CheckBox","Right");
		setResult(RESULT_OK,intent);
		finish();
	}

}

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

Re: Урок 30. Подробнее про onActivityResult. Зачем нужны req

Сообщение KamiSempai » 24 июл 2013, 12:01

У вас ошибка в MainActivity в 22 строке.
Нужно было написать:

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

sData  = data.getStringExtra("CheckBox");
И идентичность срок проверяют не с помощью "==" а с помощьб equals.

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

"Left".equals(sData)
Желательно сделать именно так как я написал, а не sData.equals("Left"), так как sData может быть null.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

vozup
Сообщения: 9
Зарегистрирован: 23 июл 2013, 20:16

Re: Урок 30. Подробнее про onActivityResult. Зачем нужны req

Сообщение vozup » 24 июл 2013, 20:05

Все равно не работает, не возвращается результат.Все уже перепробовал.

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

Re: Урок 30. Подробнее про onActivityResult. Зачем нужны req

Сообщение KamiSempai » 25 июл 2013, 15:41

vozup писал(а):Все равно не работает, не возвращается результат.Все уже перепробовал.
Что пишет?

Если бы ничего не возвращало, у вас в 22 строке обращение к null было.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

vozup
Сообщения: 9
Зарегистрирован: 23 июл 2013, 20:16

Re: Урок 30. Подробнее про onActivityResult. Зачем нужны req

Сообщение vozup » 25 июл 2013, 20:24

Никакой ошибки не выдает. Просто в MainActivity в OnActivityResult не возвращаться данные, это из логов видно.

vozup
Сообщения: 9
Зарегистрирован: 23 июл 2013, 20:16

Re: Урок 30. Подробнее про onActivityResult. Зачем нужны req

Сообщение vozup » 25 июл 2013, 20:35

Даже не возвращается в MainActivity.

assan
Сообщения: 48
Зарегистрирован: 24 мар 2013, 22:31

Re: Урок 30. Подробнее про onActivityResult. Зачем нужны req

Сообщение assan » 26 июл 2013, 05:24

vozup писал(а):Даже не возвращается в MainActivity.
наставь точки остановки и посмотри, что есть в переменных и куда заходит
это будет болеенаглядно чем логи

vozup
Сообщения: 9
Зарегистрирован: 23 июл 2013, 20:16

Re: Урок 30. Подробнее про onActivityResult. Зачем нужны req

Сообщение vozup » 26 июл 2013, 09:51

OnActivityResult вообще не вызывается

vozup
Сообщения: 9
Зарегистрирован: 23 июл 2013, 20:16

Re: Урок 30. Подробнее про onActivityResult. Зачем нужны req

Сообщение vozup » 26 июл 2013, 10:11

OnActivityResult вызывается в onResume MainActivity, но как его вызвать с возвращенными параметрами??

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

Re: Урок 30. Подробнее про onActivityResult. Зачем нужны req

Сообщение KamiSempai » 26 июл 2013, 11:51

Чему равен REQUEST_CODE_SETTINGS ?
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

vozup
Сообщения: 9
Зарегистрирован: 23 июл 2013, 20:16

Re: Урок 30. Подробнее про onActivityResult. Зачем нужны req

Сообщение vozup » 26 июл 2013, 11:52

KamiSempai писал(а):Чему равен REQUEST_CODE_SETTINGS ?
REQUEST_CODE_SETTINGS = 1

vozup
Сообщения: 9
Зарегистрирован: 23 июл 2013, 20:16

Re: Урок 30. Подробнее про onActivityResult. Зачем нужны req

Сообщение vozup » 26 июл 2013, 12:01

Вот полные коды, может у себя посмотрите:
MainActivity:

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

public class MainActivity extends Activity implements OnClickListener {
	
	final int REQUEST_CODE_SETTINGS = 1;

	Button btnSiteGo, btnLeft, btnRight;
	EditText etSiteName;
	String TAG = "States";
	TextView tvText;
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		Log.d(TAG,"onCreate MainActivity");
		etSiteName = (EditText) findViewById(R.id.etSiteName);
		
		btnSiteGo = (Button) findViewById(R.id.btnSiteGo);
		btnSiteGo.setOnClickListener(this);
		btnLeft = (Button) findViewById(R.id.btnLeft);
		btnRight = (Button) findViewById(R.id.btnRight);
		tvText = (TextView) findViewById(R.id.tvText);
	}
	
	@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;
	}
	
	public boolean onOptionsItemSelected(MenuItem item)//выбраный пункт меню
	{
		switch(item.getItemId())
		{
		case R.id.action_settings:
			Intent intent = new Intent(this, SettingsActivity.class);
			startActivityForResult(intent, REQUEST_CODE_SETTINGS);
			break;
		}
		
		return super.onOptionsItemSelected(item);
	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		Intent intent = new Intent();
		intent.setAction(Intent.ACTION_VIEW);
		intent.setData(Uri.parse("http://" + etSiteName.getText().toString()));
		startActivity(intent);
	}
	
	public void OnActivityResult(int requestCode, int resultCode, Intent data)
	{
		String sData = data.getStringExtra("CheckBox");
		Log.d(TAG,"OnActivityResult вернуло значение" + data.getStringExtra("CheckBox"));
		if(resultCode == RESULT_OK)
		{
			tvText.setText(sData);
		}
	}
}
SettingsActivity:

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

public class SettingsActivity extends Activity implements OnClickListener {
	
	Button btnApplySettings;
	CheckBox cbBtnLeft, cbBtnRight;
	String TAG = "States";
	
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.settings);
		
		Log.d(TAG, "onCreate в SettingActivity");
		
		btnApplySettings = (Button) findViewById(R.id.btnApplySettings);
		btnApplySettings.setOnClickListener(this);
		cbBtnLeft = (CheckBox) findViewById(R.id.cbBtnLeft);
		cbBtnRight = (CheckBox) findViewById(R.id.cbBtnRight);
		
	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		Intent intent = new Intent();
		if(cbBtnLeft.isChecked()) intent.putExtra("CheckBox","Left");
		if(cbBtnRight.isChecked()) intent.putExtra("CheckBox","Right");
		Log.d(TAG, intent.getStringExtra("CheckBox") + " SettingActivity до finish()");
		setResult(RESULT_OK,intent);
		finish();
	}
	
}
BrowserActivity:

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

public class BrowserActivity extends Activity {
	
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.browser);
		
		WebView wvBrowser = (WebView) findViewById(R.id.wvBrowser);
		
		Uri Data = getIntent().getData();
		wvBrowser.loadUrl(Data.toString());
	}
}
main.xml

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

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

        <EditText
            android:id="@+id/etSiteName"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="3">

            <requestFocus />
        </EditText>

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

    </LinearLayout>

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

        <Button
            android:id="@+id/btnLeft"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="left"
            android:enabled="false"
            android:text="Left" />

        <Button
            android:id="@+id/btnRight"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:enabled="false"
            android:text="Right" />

    </LinearLayout>

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

        <TextView
            android:id="@+id/tvText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="" />

    </LinearLayout>

</LinearLayout>
settings.xml

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

<?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" >

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center" >

        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="Какую кнопку отобразить?" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center" >

        <CheckBox
            android:id="@+id/cbBtnLeft"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Левая кнопка" />

        <CheckBox
            android:id="@+id/cbBtnRight"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Правая кнопка" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|center" >

        <Button
            android:id="@+id/btnApplySettings"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            android:text="Apply" />

    </LinearLayout>
    
</LinearLayout>
browser.xml

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

<?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" >

    <WebView
        android:id="@+id/wvBrowser"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

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

Re: Урок 30. Подробнее про onActivityResult. Зачем нужны req

Сообщение KamiSempai » 26 июл 2013, 14:14

Ошибка найдена. У вас OnActivityResult с большой буквы, а нужно было с маленькой: onActivityResult.
Среда воспринимает метод как какой-то другой и не переопределяет нужный onActivityResult.

PS: На будущее, если, в эклипсе, слева от метода не стоит зеленая стрелочка, значит это не метод супер класса.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Ответить