Как получить дополнительные данные от намерения на Android?


751

Как я могу отправить данные от одного действия (намерения) к другому?

Я использую этот код для отправки данных:

Intent i=new Intent(context,SendMessage.class);
i.putExtra("id", user.getUserAccountId()+"");
i.putExtra("name", user.getUserFullName());
context.startActivity(i);

82
Замечание по Java: никогда не рекомендуется «так переводить» целое число (особенно в целях примера), и, к сожалению, его часто считают хорошим и быстрым способом преобразования int в строку в java:, так user.getUserAccountId()+""как это приведет к созданию ненужных объектов быть собранным. Подумайте об использовании String.valueOf(user.getUserAccountId)или Integer.toString(user.getUserAccountId)вместо.
Пкк

5
@ Andrew S Разве это не Интернет? Это результат номер один для «получить данные из намерения»
McGuile

@ AndrewS Я согласен с МакГайлом. Кроме того, этот вопрос был опубликован некоторое время назад, поэтому ответ, вероятно, не так легко найти тогда. И если подобный вопрос еще не был опубликован в SO, то это был правильный пост.
0xКурсор

Ответы:


1213

Сначала получите намерение, с которого началась ваша деятельность, используя getIntent()метод:

Intent intent = getIntent();

Если ваши дополнительные данные представлены в виде строк, вы можете использовать intent.getStringExtra(String name)метод. В твоем случае:

String id = intent.getStringExtra("id");
String name = intent.getStringExtra("name");

6
откуда я могу все это метод ??
Adham

46
@adham: Если вы участвуете в мероприятии, из onCreate вы звоните, getIntent().getStringExtra("id");чтобы получить строку идентификатора
ccheneson

1
Вы можете получить намерение, с которого началась ваша деятельность, вызвав getIntent()метод. Я обновил ответ.
Малкольм

1
@Eatlon Если у вас есть проблема с конкретной библиотекой, вы должны создать отдельный вопрос об этом.
Малкольм

1
@MelColm В чем разница между getExtra (). GetString и getStringExtra ()?
Амит Трипати

188

В принимающей деятельности

Bundle extras = getIntent().getExtras(); 
String userName;

if (extras != null) {
    userName = extras.getString("name");
    // and get whatever type user account id is
}

6
Почему это предпочтительнее, чемgetStringExtra?
Игорь Ганапольский

6
Я предполагаю: если дополнения могут быть null, вся выборка дополнений может быть пропущена. Используя getStringExtra, вы в основном меняете его на серию if(extras != null) { return extras.getString(name) }. По одному на каждого getStringExtraзвонка. Эта опция проверит nullодин раз, и если да, то не будет читать Bundleвообще. Кроме того, getStringExtraвероятно , будет продолжать спрашивать getExtrasвнутренне каждый раз. Таким образом, у вас просто есть больше вызовов функций.
Даниэль Сонк

39
//  How to send value using intent from one class to another class
//  class A(which will send data)
    Intent theIntent = new Intent(this, B.class);
    theIntent.putExtra("name", john);
    startActivity(theIntent);
//  How to get these values in another class
//  Class B
    Intent i= getIntent();
    i.getStringExtra("name");
//  if you log here i than you will get the value of i i.e. john

31

Добавить вверх

Установить данные

String value = "Hello World!";
Intent intent = new Intent(getApplicationContext(), NewActivity.class);
intent.putExtra("sample_name", value);
startActivity(intent);

Получить данные

String value;
Bundle bundle = getIntent().getExtras();
if (bundle != null) {
    value = bundle.getString("sample_name");
}

17

Вместо инициализации другого нового Намерения для получения данных, просто сделайте это:

String id = getIntent().getStringExtra("id");

11

Если используется в FragmentActivity, попробуйте это:

Первая страница расширяет FragmentActivity

Intent Tabdetail = new Intent(getApplicationContext(), ReceivePage.class);
Tabdetail.putExtra("Marker", marker.getTitle().toString());
startActivity(Tabdetail);

Во фрагменте нужно просто позвонить getActivity() сначала ,

Вторая страница расширяет фрагмент :

String receive = getActivity().getIntent().getExtras().getString("name");

1
Также вы можете использовать getStringExtra ("name") вместо getExtras (). GetString ("name")
сюжет

7

Если вы пытаетесь получить дополнительные данные фрагментами, вы можете попробовать использовать:

Поместите данные, используя:

Bundle args = new Bundle();
args.putInt(DummySectionFragment.ARG_SECTION_NUMBER);

Получить данные, используя:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {


  getArguments().getInt(ARG_SECTION_NUMBER);
  getArguments().getString(ARG_SECTION_STRING);
  getArguments().getBoolean(ARG_SECTION_BOOL);
  getArguments().getChar(ARG_SECTION_CHAR);
  getArguments().getByte(ARG_SECTION_DATA);

}

6

Вы можете получить любой тип дополнительных данных из намерения , независимо от того, является ли это объектом, строкой или любым типом данных.

Bundle extra = getIntent().getExtras();

if (extra != null){
    String str1 = (String) extra.get("obj"); // get a object

    String str2 =  extra.getString("string"); //get a string
}

и самое короткое решение :

Boolean isGranted = getIntent().getBooleanExtra("tag", false);

4

** Положите данные по намерению - **

 Intent intent = new Intent(mContext, HomeWorkReportActivity.class);
            intent.putExtra("subjectName","Maths");
            intent.putExtra("instituteId",22);
            mContext.startActivity(intent);

** Получить данные по намерению - **

  String subName = getIntent().getStringExtra("subjectName");
  int insId  getIntent().getIntExtra("instituteId",0);

если мы отправим целочисленное значение по намерению. когда мы должны использовать 2-й параметр 0 в getIntent (). getIntExtra ("instituteId", 0), иначе мы не используем 0, тогда android выдает мне ошибку.


2

Котлин

Первое занятие

val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("key", "value")
startActivity(intent)

Вторая деятельность

val value = getIntent().getStringExtra("key")

Предложение

Всегда помещайте ключи в постоянный файл для более управляемого пути.

companion object {
    val PUT_EXTRA_USER = "PUT_EXTRA_USER"
}

1

Просто предложение:

Вместо использования «id» или «name» в вашем i.putExtra («id» .....), я бы предложил, когда это имеет смысл, использовать текущие стандартные поля, которые можно использовать с putExtra (), т.е. Intent.EXTRA_something.

Полный список можно найти в Intent (Android Developers).


1

Мы можем сделать это простыми средствами:

В FirstActivity:

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("uid", uid.toString());
intent.putExtra("pwd", pwd.toString());
startActivity(intent);

В SecondActivity:

    try {
        Intent intent = getIntent();

        String uid = intent.getStringExtra("uid");
        String pwd = intent.getStringExtra("pwd");

    } catch (Exception e) {
        e.printStackTrace();
        Log.e("getStringExtra_EX", e + "");
    }

1

Передайте намерение со значением в первом действии:

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("uid", uid.toString());
intent.putExtra("pwd", pwd.toString());
startActivity(intent);

Получить намерение на второй деятельности; -

Intent intent = getIntent();
String user = intent.getStringExtra("uid");
String pass = intent.getStringExtra("pwd");

Обычно мы используем два метода, чтобы отправить значение и получить его. Для отправки значения, которое мы будем использовать, intent.putExtra("key", Value);и во время получения намерения на другое действие мы будем использовать, intent.getStringExtra("key");чтобы получить данные намерения, Stringили использовать другой доступный метод для получения других типов данных ( Integer, Booleanи т. Д.). Ключом может быть любое ключевое слово, чтобы идентифицировать значение, значит, какое значение вы разделяете. Надеюсь, это сработает для вас.


0

Вы также можете сделать это
// положить значение в намерении

    Intent in = new Intent(MainActivity.this, Booked.class);
    in.putExtra("filter", "Booked");
    startActivity(in);

// получить значение из намерения

    Intent intent = getIntent();
    Bundle bundle = intent.getExtras();
    String filter = bundle.getString("filter");

0

Получение различных типов экстра из намерения

Для доступа к данным из Intent вы должны знать две вещи.

  • KEY
  • DataType ваших данных.

В классе Intent существуют разные методы для извлечения различных типов данных. Это выглядит так

getIntent (). XXXX (KEY) или intent.XXX (KEY);


Поэтому, если вы знаете тип данных вашей переменной, который вы установили в otherActivity, вы можете использовать соответствующий метод.

Пример получения строки в вашей активности из намерения

String profileName = getIntent().getStringExtra("SomeKey");

Список разных вариантов методов для разных dataType

Вы можете увидеть список доступных методов в Официальной документации о намерениях .


0

Это для адаптера, для активности вам просто нужно изменить mContext на ваше имя Activty, а для фрагмента вам нужно изменить mContext на getActivity ()

 public static ArrayList<String> tags_array ;// static array list if you want to pass array data

      public void sendDataBundle(){
            tags_array = new ArrayList();
            tags_array.add("hashtag");//few array data
            tags_array.add("selling");
            tags_array.add("cityname");
            tags_array.add("more");
            tags_array.add("mobile");
            tags_array.add("android");
            tags_array.add("dress");
            Intent su = new Intent(mContext, ViewItemActivity.class);
            Bundle bun1 = new Bundle();
            bun1.putString("product_title","My Product Titile");
            bun1.putString("product_description", "My Product Discription");
            bun1.putString("category", "Product Category");
            bun1.putStringArrayList("hashtag", tags_array);//to pass array list 
            su.putExtras(bun1);
            mContext.startActivity(su);
        }

-2

Я только что опубликовал ответ здесь , что охватывает эту тему в немного более подробно, в том числе некоторых альтернатив.

Использует Vapor API , новую платформу Android, вдохновленную jQuery, которую я написал для упрощения разработки Android. Посмотрите на пример в этом ответе о том, как вы можете легко передавать данные между активами.

Также демонстрируется VaporIntent, что позволяет вам связывать вызовы методов и использовать перегруженный .put(...)метод:

$.Intent().put("data", "myData").put("more", 568)...

Вы можете легко передавать данные по всему вашему приложению с помощью Vapor API , так что, надеюсь, это будет полезно вам и другим пользователям при разработке приложений.


1
Я видел некоторые из ваших ответов о Vapor API. Это интересно. Как вы получаете эти данные (например, Intent.getextras ()) ??
Kalai.G

Проверьте это , это объясняет, как получить дополнительные функции Intent. Более подробная информация здесь . Это помогает?
Дарий

2
Я думаю, что методы цепочки имеют слишком много накладных расходов. Если вы вызываете какой-либо метод, который возвращает «this» просто для цепочки (то есть «setters»), это нарушает принципы проектирования ООП. Мне нравится простота, но отладка может также причинять боль, если у вас есть цепочка методов. Я вижу ценность в API, я просто не согласен с цепочкой методов.
nckbrz
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.