Урок 29. Вызываем Activity и получаем результат. Метод startActivityForResult

Обсуждение уроков
isachenko
Сообщения: 47
Зарегистрирован: 30 июл 2014, 21:43

Re: Урок 29. Вызываем Activity и получаем результат. Метод s

Сообщение isachenko » 29 ноя 2014, 16:29

Товарищи, мне нужно решить такую задачу - получить результат для ListView.
Приложение работает так: из списка переходим на активность, там жмём на кнопку, возвращаемся, и пункт списка (который мы нажимали) меняет свой фон-картинку (из drawable ресурсов). Я так понимаю, это тоже делается с помощью onResult, и мне нужно передавать не data, а ресурс.
Эти изменения в списке мне так же надо будет хранить в памяти, чтоб при выходе они не стирались, но это уже у другом топике.
Может, у кого-то есть пример подобной реализации. Ну или просто добрый совет.
Спасибо!
Спасибо за уроки!

Аватара пользователя
elron
Сообщения: 31
Зарегистрирован: 14 окт 2012, 13:29

Re: Урок 29. Вызываем Activity и получаем результат. Метод s

Сообщение elron » 29 ноя 2014, 17:27

В списке нужно запустить другое активити:
[syntax=java]public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
..
lvLasts.setOnItemClickListener(onItemClick);
.. }
OnItemClickListener onItemClick = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent(getApplicationContext(), SecondScreen.class);
intent.putExtra("key", "value1");
startActivityForResult(intent, 9);
}
};[/syntax]
Потом получить результат:
[syntax=java]@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (data == null) {return;}
if (resultCode == RESULT_CANCELED) {return;}
if (requestCode == 9) {
String name = data.getStringExtra("key");
// получили резульат
}
}[/syntax]
Во втором активити получаем данные и передаем обратно:
[syntax=java]protected void onCreate(Bundle savedInstanceState) {
..
String user = getIntent().getStringExtra("key");
Intent intent = new Intent();
intent.putExtra("key", "Васька");
setResult(Activity.RESULT_OK, intent); // или Activity.RESULT_CANCELED
..
}
[/syntax]

isachenko
Сообщения: 47
Зарегистрирован: 30 июл 2014, 21:43

Re: Урок 29. Вызываем Activity и получаем результат. Метод s

Сообщение isachenko » 04 дек 2014, 16:41

elron писал(а):В списке нужно запустить другое активити:
[syntax=java]public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
..
lvLasts.setOnItemClickListener(onItemClick);
.. }
OnItemClickListener onItemClick = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent(getApplicationContext(), SecondScreen.class);
intent.putExtra("key", "value1");
startActivityForResult(intent, 9);
}
};[/syntax]
Потом получить результат:
[syntax=java]@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (data == null) {return;}
if (resultCode == RESULT_CANCELED) {return;}
if (requestCode == 9) {
String name = data.getStringExtra("key");
// получили резульат
}
}[/syntax]
Во втором активити получаем данные и передаем обратно:
[syntax=java]protected void onCreate(Bundle savedInstanceState) {
..
String user = getIntent().getStringExtra("key");
Intent intent = new Intent();
intent.putExtra("key", "Васька");
setResult(Activity.RESULT_OK, intent); // или Activity.RESULT_CANCELED
..
}
[/syntax]
а что тут "key", string name, string user?
т.е. что в них должно быть?
объясните, пожалуйста.
Спасибо за уроки!

Аватара пользователя
elron
Сообщения: 31
Зарегистрирован: 14 окт 2012, 13:29

Re: Урок 29. Вызываем Activity и получаем результат. Метод s

Сообщение elron » 04 дек 2014, 18:23

intent.putExtra("key", "value1");
- передает ключ и значение в контейнер, у этого контейнера потом извлекается значение(getIntent().getStringExtra("key")), но нужно знать ключ, этот ключ ("key"). Без ключа не получишь переданное значение. Это в уроке написано.

isachenko
Сообщения: 47
Зарегистрирован: 30 июл 2014, 21:43

Re: Урок 29. Вызываем Activity и получаем результат. Метод s

Сообщение isachenko » 04 дек 2014, 19:02

elron писал(а):intent.putExtra("key", "value1");
- передает ключ и значение в контейнер, у этого контейнера потом извлекается значение(getIntent().getStringExtra("key")), но нужно знать ключ, этот ключ ("key"). Без ключа не получишь переданное значение. Это в уроке написано.
Спасибо Вам за помощь, человечище!
Я помещаю в Intent объект с именем ключа (key) и значением (R.drawable.newImg), верно?
А что мне нужно положить в string name и string user? что-то из этого должно быть массивом новых значений drawable для пунктов списка, да?
Спасибо за уроки!

Аватара пользователя
elron
Сообщения: 31
Зарегистрирован: 14 окт 2012, 13:29

Re: Урок 29. Вызываем Activity и получаем результат. Метод s

Сообщение elron » 04 дек 2014, 19:10

- Я помещаю в Intent объект с именем ключа (key) и значением (R.drawable.newImg), верно?
- Да.
Что нужно передать, то и кладите. String user = getIntent().getStringExtra("key"); в строку user заносится значение(которое берется у контейнера, используя ключ). Я не знаю что вам нужно, это пример кода. Адаптируйте этот пример под вашу ситуацию. Советую для начала изучить java(не смотря на то что этих интентов там нет).

Аватара пользователя
elron
Сообщения: 31
Зарегистрирован: 14 окт 2012, 13:29

Re: Урок 29. Вызываем Activity и получаем результат. Метод s

Сообщение elron » 04 дек 2014, 19:19

Посмотрите Бриллиантовую руку, там он сказал фразу(ключ) и получил бриллианты(значение), так и здесь))
http://www.youtube.com/watch?v=gaG231aXCdM

relios
Сообщения: 2
Зарегистрирован: 27 мар 2015, 03:03

Re: Урок 29. Вызываем Activity и получаем результат. Метод s

Сообщение relios » 27 мар 2015, 03:12

Добрый день.
Проблема с этим и предыдущим уроком в AndroidStudio.
В предыдущем уроке при вызове ViewActivity приложение падает.
В этом уроке приложение падает после ввода имени и попытке возврата в MainActivity.
Логи:
Предыдущий урок:

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

03-27 00:10:07.219    1019-1019/ru.startandroid.p0281_intentextras E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.NullPointerException
            at ru.startandroid.p0281_intentextras.MainActivity.onClick(MainActivity.java:60)
            at android.view.View.performClick(View.java:4084)
            at android.view.View$PerformClick.run(View.java:16966)
            at android.os.Handler.handleCallback(Handler.java:615)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:4745)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at dalvik.system.NativeStart.main(Native Method)
Этот урок:

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

03-27 00:11:17.779    1081-1081/ru.startandroid.p_0291simpleactivityresult E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.NullPointerException
            at ru.startandroid.p_0291simpleactivityresult.NameActivity.onClick(NameActivity.java:55)
            at android.view.View.performClick(View.java:4084)
            at android.view.View$PerformClick.run(View.java:16966)
            at android.os.Handler.handleCallback(Handler.java:615)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:4745)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at dalvik.system.NativeStart.main(Native Method)
P.S. Сам код не стал копировать, т.к. он идентичен тому, что написан в уроке.

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

Re: Урок 29. Вызываем Activity и получаем результат. Метод s

Сообщение klblk » 27 мар 2015, 06:31

relios писал(а):P.S. Сам код не стал копировать, т.к. он идентичен тому, что написан в уроке.
не верю! Был бы идентичный, null-ов бы не было.
Судя по 28 уроку null у вас либо etFName, либо etLName.
А это значит либо в onCreate() что-то не то, либо в layout'е.

relios
Сообщения: 2
Зарегистрирован: 27 мар 2015, 03:03

Re: Урок 29. Вызываем Activity и получаем результат. Метод s

Сообщение relios » 31 мар 2015, 21:51

klblk писал(а):
relios писал(а):P.S. Сам код не стал копировать, т.к. он идентичен тому, что написан в уроке.
не верю! Был бы идентичный, null-ов бы не было.
Судя по 28 уроку null у вас либо etFName, либо etLName.
А это значит либо в onCreate() что-то не то, либо в layout'е.
Вот коды 28-го урока:
activity_main.xml

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:gravity="center_horizontal"
        android:text="Input your Name">
    </TextView>
    <TableLayout
        android:id="@+id/tableLayout1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:stretchColumns="1">
        <TableRow
            android:id="@+id/tableRow1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <TextView
                android:id="@+id/textView1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="First Name">
            </TextView>
            <EditText
                android:id="@+id/etFName"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="5dp">
                <requestFocus>
                </requestFocus>
            </EditText>
        </TableRow>
        <TableRow
            android:id="@+id/tableRow2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <TextView
                android:id="@+id/textView2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="Last Name">
            </TextView>
            <EditText
                android:id="@+id/etLName"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="5dp">
            </EditText>
        </TableRow>
    </TableLayout>
    <Button
        android:id="@+id/btnSubmit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="Submit">
    </Button>
</LinearLayout>
MainActivity.java:

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

package ru.startandroid.p0281_intentextras;

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


public class MainActivity extends Activity implements View.OnClickListener {

    EditText etFName;
    EditText etLName;

    Button btnSubmit;

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

        EditText etFName = (EditText) findViewById(R.id.etFName);
        EditText etLName = (EditText) findViewById(R.id.etLName);

        Button btnSubmit = (Button) findViewById(R.id.btnSubmit);
        btnSubmit.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.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();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onClick(View view) {
        Intent intent = new Intent(this, ViewActivity.class);
        intent.putExtra("fname", etFName.getText().toString());
        intent.putExtra("lname", etLName.getText().toString());
        startActivity(intent);
    }
}
view.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">
    <TextView
        android:id="@+id/tvView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="20dp"
        android:text="TextView"
        android:textSize="20sp">
    </TextView>
</LinearLayout>
ViewActivity.java:

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

package ru.startandroid.p0281_intentextras;

import android.app.Activity;
import android.content.Intent;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;


public class ViewActivity extends Activity {

    TextView tvView;

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

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

        Intent intent = getIntent();

        String fName = intent.getStringExtra("fname");
        String lName = intent.getStringExtra("lname");

        tvView.setText("Your name is: " + fName + " " + lName);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_view, 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();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

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

Re: Урок 29. Вызываем Activity и получаем результат. Метод s

Сообщение klblk » 01 апр 2015, 07:19

перед тем как выкладывать код вы внимательно прочитали моё сообщение выше?
Я сказал что ошибка возможно в onCreate() и был прав. Сравните свой код и код урока (построчно)

Sergey777
Сообщения: 68
Зарегистрирован: 30 мар 2015, 17:16

Re: Урок 29. Вызываем Activity и получаем результат. Метод s

Сообщение Sergey777 » 02 апр 2015, 08:48

Хотелось бы добавить к статье (может кому-нибудь поможет) о существовании такой вот штуки: Если в активности А, куда нужно принять результат от активности Б есть диалоги, то такой вид передачи работать не будет, так как при использовании диалогов срабатывает метод onActivityResult ().

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

Re: Урок 29. Вызываем Activity и получаем результат. Метод s

Сообщение doter.ua » 02 апр 2015, 09:36

Sergey777 писал(а):Хотелось бы добавить к статье (может кому-нибудь поможет) о существовании такой вот штуки: Если в активности А, куда нужно принять результат от активности Б есть диалоги, то такой вид передачи работать не будет, так как при использовании диалогов срабатывает метод onActivityResult ().
есть же реквест код для определения от кого результат пришел.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Sergey777
Сообщения: 68
Зарегистрирован: 30 мар 2015, 17:16

Re: Урок 29. Вызываем Activity и получаем результат. Метод s

Сообщение Sergey777 » 08 апр 2015, 09:18

doter.ua писал(а):
Sergey777 писал(а):Хотелось бы добавить к статье (может кому-нибудь поможет) о существовании такой вот штуки: Если в активности А, куда нужно принять результат от активности Б есть диалоги, то такой вид передачи работать не будет, так как при использовании диалогов срабатывает метод onActivityResult ().
есть же реквест код для определения от кого результат пришел.
Может конечно я коряворукий, но у меня активность, куда нужно принять данные, не загружалась. А потом в сети на одном из форумов писали, что есть такая проблема с диалогами.

w201
Сообщения: 9
Зарегистрирован: 08 дек 2013, 12:43

Re: Урок 29. Вызываем Activity и получаем результат. Метод s

Сообщение w201 » 28 апр 2015, 20:34

Вопрос.

Активити А вызывает активити Б. Активити Б меняет ориентацию и пересоздается. Метод onActivityResult не срабатывает. Что делать?

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

Re: Урок 29. Вызываем Activity и получаем результат. Метод s

Сообщение doter.ua » 28 апр 2015, 23:12

w201 писал(а):Вопрос.

Активити А вызывает активити Б. Активити Б меняет ориентацию и пересоздается. Метод onActivityResult не срабатывает. Что делать?
По-моему onActivityResult срабатывает когда активити, запущенное forResult, закрывается и вызывает метод setResult.
Intent mIntent = new Intent();
mIntent.putExtras(bundle);
setResult(RESULT_OK, mIntent);
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

w201
Сообщения: 9
Зарегистрирован: 08 дек 2013, 12:43

Re: Урок 29. Вызываем Activity и получаем результат. Метод s

Сообщение w201 » 29 апр 2015, 08:40

По вашему, да и по моему так и должно быть. Но если вы повернете ориентацию активити В, то onActivityResult не будет вызван. Видимо где-то теряется указатель на активити В у активити А....Но что с этим делать совершенно непонятно.

Аватара пользователя
Коваленко Павел
Сообщения: 14
Зарегистрирован: 19 апр 2015, 16:35

Re: Урок 29. Вызываем Activity и получаем результат. Метод s

Сообщение Коваленко Павел » 29 апр 2015, 09:16

Доброго времени суток. На сайте, на этом уроке упал интерфейс.

Евгений Суханов
Сообщения: 12
Зарегистрирован: 15 мар 2015, 21:55

Re: Урок 29. Вызываем Activity и получаем результат. Метод s

Сообщение Евгений Суханов » 06 май 2015, 09:23

Приветствую всех. Очень нужна помощь. Есть два активити (First Second) Делаю переход из First в Second startActivityForResult(intent, 1); или startActivity(intent); (пробовал оба) Как мне вернуться обратно из Second активити, именно в то место откуда я туда попал? (Для перехода в Second activity использовался элемент листа)

Ответить