Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Получение результата из Activity



В прошлой теме было рассмотрено как вызывать новую Activity и передавать ей некоторые данные. Но мы можем не только передавать данные запускаемой activity, но и ожидать от нее некоторого результата работы.

К примеру, пусть у нас в проекте будут две activity: MainActivity и SecondActivity. А для каждой activity есть свой файл интерфейса: activity_main.xml и activity_second.xml.

В прошлой теме мы вызывали новую activity с помощью метода startActivity(). Для получения же результата работы запускаемой activity необходимо использовать метод startActivityForResult(Intent intent, int requestCode). Этот метод принимает два параметра: Intent передает в запускаемую activity данные, а второй параметр requestCode указывает на целочисленный код запроса. Рассмотрим его использование на примере.

Так, определим в файле activity_main.xml следующий интерфейс:

<? xml version=" 1.0" encoding=" utf-8"? >

< LinearLayout xmlns: android=" http: //schemas.android.com/apk/res/android"

android: id=" @+id/activity_main"

android: layout_width=" match_parent"

android: layout_height=" match_parent"

android: padding=" 16dp"

android: orientation=" vertical" >

< TextView

   android: id=" @+id/textView"

   android: layout_width=" match_parent"

   android: layout_height=" wrap_content"

   android: text=" Укажите возраст"

   android: textSize=" 22dp" />

< EditText

   android: id=" @+id/ageBox"

   android: inputType=" number"

   android: layout_width=" match_parent"

   android: layout_height=" wrap_content" />

< Button

   android: id=" @+id/navButton"

   android: layout_width=" wrap_content"

   android: layout_height=" wrap_content"

   android: text=" Отправить"

   android: onClick=" onClick" />

 

< /LinearLayout>

Для ввода данных здесь определен элемент EditText, а для отправки - кнопка.

Определим в классе MainActivity запуск второй activity:

import android.content.Intent;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.view.View;

import android.widget.EditText;

import android.widget.TextView;

 

public class MainActivity extends AppCompatActivity {

 

static final String AGE_KEY = " AGE";

static final String ACCESS_MESSAGE=" ACCESS_MESSAGE";

private static final int REQUEST_ACCESS_TYPE=1;

 

TextView textView;

protected void onCreate(Bundle savedInstanceState) {

   super.onCreate(savedInstanceState);

   setContentView(R.layout.activity_main);

 

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

}

public void onClick(View view) {

 

   // получаем введенный возраст

   EditText ageBox = (EditText) findViewById(R.id.ageBox);

   String age = ageBox.getText().toString();

 

   Intent intent = new Intent(this, SecondActivity.class);

   intent.putExtra(AGE_KEY, age);

   startActivityForResult(intent, REQUEST_ACCESS_TYPE);

}

 

@Override

public void onActivityResult(int requestCode, int resultCode, Intent data){

   if(requestCode==REQUEST_ACCESS_TYPE){

       if(resultCode==RESULT_OK){

           String accessMessage = data.getStringExtra(ACCESS_MESSAGE);

           textView.setText(accessMessage);

       }

       else{

           textView.setText(" Ошибка доступа" );

       }

   }

   else{

       super.onActivityResult(requestCode, resultCode, data);

   }

}

}

В обработчике нажатия кнопки onClick() получаем введенный в текстовое поле возраст, добавляем его в объект Intent с ключем AGE_KEY и запускаем SecondActivity с помощью метода startActivityForResult. Причем числовой код запроса представляет константу REQUEST_ACCESS_TYPE. Здесь не столь важно, какое число передавать в качестве результата, но используя это число, мы потом можем выполнить обработку полученного ответа от SecondActivity, особенно если в разных ситуациях применяется несколько числовых кодов запроса.

Для получения и обработки результата, полученного от SecondActivity, необходимо переопределить метод onActivityResult. Этот метод принимает три параметра:

  • requestCode: числовой код запроса, который был отправлен вторым параметром в startActivityForResult
  • resultCode: числовой код результата. В качестве результата, как правило, применяются встроенные константы RESULT_OK и RESULT_CANCELED.
  • data: отправленные данные из SecondActivity в MainActivity

В данном случае в методе onActivityResult() выводятся полученные данные в элемент TextView.

Далее перейдем к SecondActivity и определим в файле activity_second.xml набор кнопок:

<? xml version=" 1.0" encoding=" utf-8"? >

< LinearLayout xmlns: android=" http: //schemas.android.com/apk/res/android"

android: id=" @+id/activity_second"

android: layout_width=" match_parent"

android: layout_height=" match_parent"

android: orientation=" vertical"

android: padding=" 16dp" >

< TextView

   android: id=" @+id/ageView"

   android: textSize=" 22sp"

   android: layout_width=" match_parent"

   android: layout_height=" wrap_content" />

< Button

   android: id=" @+id/button1"

   android: text=" Открыть доступ"

   android: layout_width=" match_parent"

   android: layout_height=" wrap_content"

   android: onClick=" onButton1Click" />

< Button

   android: id=" @+id/button2"

   android: text=" Отклонить доступ"

   android: layout_width=" match_parent"

   android: layout_height=" wrap_content"

   android: onClick=" onButton2Click" />

< Button

   android: id=" @+id/button3"

   android: text=" Возраст недействителен"

   android: layout_width=" match_parent"

   android: layout_height=" wrap_content"

   android: onClick=" onButton3Click" />

< Button

   android: id=" @+id/cancel"

   android: text=" Отмена"

   android: layout_width=" match_parent"

   android: layout_height=" wrap_content"

   android: onClick=" onCancelClick" />

< /LinearLayout>

А в классе SecondActivity определим обработчики для этих кнопок:

import android.content.Intent;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.view.View;

import android.widget.TextView;

 

public class SecondActivity extends AppCompatActivity {

 

@Override

protected void onCreate(Bundle savedInstanceState) {

   super.onCreate(savedInstanceState);

   setContentView(R.layout.activity_second);

 

   Bundle extras = getIntent().getExtras();

   if (extras! = null) {

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

       String age = extras.getString(MainActivity.AGE_KEY);

       ageView.setText(" Возраст: " +  age);

   }

}

public void onCancelClick(View v) {

   setResult(RESULT_CANCELED);

   finish();

}

public void onButton1Click(View v) {

   sendMessage(" Доступ разрешен" );

}

public void onButton2Click(View v) {

   sendMessage(" Доступ запрещен" );

}

public void onButton3Click(View v) {

   sendMessage(" Недопустимый возраст" );

}

private void sendMessage(String message){

 

   Intent data = new Intent();

   data.putExtra(MainActivity.ACCESS_MESSAGE, message);

   setResult(RESULT_OK, data);

   finish();

}

}

Три кнопки вызывают метод sendMessage(), в который передают отправляемый ответ. Это и будет то сообщение, которое получить MainActivity в методе onActivityResult.

Для возврата результата необходимо вызвать метод setResult(), в который передается два параметра:

  • числовой код результата
  • отправляемые данные

После вызова метода setResult() нужно вызвать метод finish, который уничтожит текущую activity.

Одна кнопка вызывает обработчик onCancelClick(), в котором передается в setResult только код результата - RESULT_CANCELED.

То есть условно говоря, мы получаем в SecondActivity введенный в MainActivity возраст и с помощью нажатия определенной кнопки возвращаем некоторый результат в виде сообщения.

В зависимости от нажатой кнопки на SecondActivity мы будем получать разные результаты в MainActivity:


Поделиться:



Последнее изменение этой страницы: 2019-05-04; Просмотров: 308; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.039 с.)
Главная | Случайная страница | Обратная связь