Как получить дополнительные данные от намерения на Android?
Как я могу отправить данные от одного действия (намерения) к другому?
Я использую этот код для отправки данных:
Intent i=new Intent(context,SendMessage.class);
i.putExtra("id", user.getUserAccountId()+"");
i.putExtra("name", user.getUserFullName());
context.startActivity(i);
19 ответов
Сначала получите намерение, с которого началась ваша деятельность, используя getIntent()
метод:
Intent intent = getIntent();
Если ваши дополнительные данные представлены в виде строк, то вы можете использовать intent.getStringExtra(String name)
метод. В твоем случае:
String id = intent.getStringExtra("id");
String name = intent.getStringExtra("name");
В принимающей деятельности
Bundle extras = getIntent().getExtras();
String userName;
if (extras != null) {
userName = extras.getString("name");
// and get whatever type user account id is
}
// 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
Добавить вверх
Установить данные
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");
}
Вместо инициализации другого нового Намерения для получения данных, просто сделайте это:
String id = getIntent().getStringExtra("id");
** Поместите данные по намерению - **
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);
если мы отправим целочисленное значение по намерению. когда мы должны использовать второй параметр 0 в getIntent().getIntExtra("InstituteId",0), иначе мы не используем 0, тогда android выдаст мне ошибку.
Если используется в 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");
Если вы пытаетесь получить дополнительные данные во фрагментах, то вы можете попробовать использовать:
Поместите данные, используя:
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);
}
Котлин
Первое занятие
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"
}
Вы можете получить любой тип дополнительного данных из намерения, независимо от того, является ли он объектом или строкой или данными любого типа.
Bundle extra = getIntent().getExtras();
if (extra != null){
String str1 = (String) extra.get("obj"); // get a object
String str2 = extra.getString("string"); //get a string
}
Передайте намерение со значением в первом действии:
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
, так далее.). Ключом может быть любое ключевое слово, чтобы идентифицировать значение, значит, какое значение вы разделяете. Надеюсь, это сработает для вас.
Просто предложение:
Вместо использования "id" или "name" в вашем i.putExtra("id".....), я бы предложил, когда это имеет смысл, использовать текущие стандартные поля, которые можно использовать с putExtra(), т.е. Intent.EXTRA_something.
Полный список можно найти в Intent (Android Developers).
Мы можем сделать это простыми средствами:
В 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 + "");
}
Это для адаптера, для активности вам просто нужно изменить 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);
}
Вы также можете сделать это
// положить значение в намерение
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");
Получение различных типов экстра из намерения
Для доступа к данным из Intent вы должны знать две вещи.
- KEY
- DataType ваших данных.
В классе Intent есть разные методы для извлечения разных типов данных. Это выглядит так
getIntent().XXXX(KEY) или intent.XXX(KEY);
Поэтому, если вы знаете тип данных вашей переменной, который вы установили в otherActivity, вы можете использовать соответствующий метод.
Пример получения строки в вашей активности из намерения
String profileName = getIntent().getStringExtra("SomeKey");
Список разных вариантов методов для разных dataType
Вы можете увидеть список доступных методов в Официальной документации о намерениях.
A class to B class Data Sending
A class:
Intent in = new Intent(A.this, B.class);
in.putExtra("Name", ""+user.getUserFullName());
startActivity(in);
B class:
String name = getIntent().getStringExtra("Name");
В Kotlin и Jetpack Compose используйте это:
val context = LocalContext.current
val intent = Intent(context, Activity2::class.java)
intent.putExtra("name", "John")
intent.putExtra("data2","aaaa")
context.startActivity(intent)
и в Деятельности2:
val intent = intent
val name = intent.getStringExtra("name")
val data2 = intent.getStringExtra("data2")
Вы можете протестировать, написав в logcat:
`Log.d("A2", "Name $name $data2")`
Я только что опубликовал ответ, который охватывает эту тему более подробно, включая некоторые альтернативы.
Он использует Vapor API, новую платформу Android, вдохновленную jQuery, которую я написал для упрощения разработки Android. Посмотрите на пример в этом ответе о том, как вы можете легко передавать данные между активами.
Также это демонстрирует VaporIntent
, который позволяет вам цеплять вызовы методов и использовать перегруженные .put(...)
метод:
$.Intent().put("data", "myData").put("more", 568)...
Вы можете легко передавать данные по всему вашему приложению с помощью Vapor API, так что, надеюсь, это будет полезно вам и другим пользователям при разработке приложений.