Як отримати додаткові дані від намірів на Android?


749

Як я можу надсилати дані від однієї діяльності (наміру) до іншої?

Я використовую цей код для надсилання даних:

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)замість цього.
pkk

5
@Andrew S Це не Інтернет? Це результат номер один для "отримати дані з наміру"
МакГейл

@AndrewS Я згоден з McGuile. Крім того, це питання було розміщено деякий час тому, тому відповідь, ймовірно, було не так просто знайти тоді. І якщо подібне питання ще не було опубліковане в SO, то це було дійсною публікацією.
0xCursor

Відповіді:


1211

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

Intent intent = getIntent();

Якщо ваші додаткові дані представлені у вигляді рядків, то ви можете використовувати intent.getStringExtra(String name)метод. У вашому випадку:

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

6
звідки я можу весь цей метод ??
Адам

46
@adham: Якщо ви займаєтесь діяльністю, зсередини onCreate ви закликаєте getIntent().getStringExtra("id");отримати рядок 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 ("ім'я") замість getExtras (). GetString ("ім'я")
Сюжет

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);

якщо ми надсилаємо значення Integer за допомогою намірів. коли ми повинні використовувати 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 (), тобто Намір.EXTRA_щось.

Повний список можна знайти в Інтенті (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

Отримання різних видів зайвого від наміру

Для доступу до даних із Намір ви повинні знати дві речі.

  • КЛЮЧОВИЙ
  • DataType ваших даних.

У класі намірів існують різні методи вилучення різних типів даних. Це виглядає приблизно так

getIntent (). XXXX (KEY) або наміру.XXX (KEY);


Тож якщо ви знаєте тип даних вашої варіабельності, який ви встановили в otherActivity, ви можете використовувати відповідний метод.

Приклад для отримання рядка у вашій діяльності з наміру

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

Перелік різних варіантів методів для різних типів даних

Перелік доступних методів ви можете побачити в Офіційній документації про наміри .


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

Я щойно опублікував відповідь тут , що охоплює цю тему в трохи більш докладно, в тому числі деяких альтернатив.

Він використовує API Vapor , нову рамку Android, натхненну jQuery, яку я написав для спрощення Android Dev. Перегляньте приклад у цій відповіді, як можна легко передавати дані між активами.

Крім того, він демонструє VaporIntent, що дозволяє ланцюжок викликів методу та використовувати перевантажений .put(...)метод:

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

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


1
я бачив деякі ваші відповіді про Vapor API.Це цікаво. Звідки ви отримуєте ці дані (наприклад, Intent.getextras ()) ??
Kalai.G

Перевірте це , там пояснюється, як отримати додаткові додатки. Детальніше тут . Чи допомагає це?
Дарій

2
Я думаю, що способи ланцюга мають надто великі витрати. Якщо ви викликаєте будь-який метод, який повертає "це" просто для досягнення можливості (тобто "сеттерів"), це порушує принципи дизайну OOP. Мені подобається простота, але налагодження, можливо, також болить, якщо у вас є ланцюжок методів. Я бачу цінність в API, я просто не згоден з методом ланцюга.
nckbrz
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.