Làm cách nào để có được dữ liệu bổ sung từ ý định trên Android?


750

Làm cách nào tôi có thể gửi dữ liệu từ một hoạt động (ý định) sang hoạt động khác?

Tôi sử dụng mã này để gửi dữ liệu:

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

82
Lưu ý bên Java: Không bao giờ là một ý tưởng tốt để "xâu chuỗi" số nguyên như vậy (đặc biệt là mục đích ví dụ), và thật không may, nó thường được coi là một cách tốt, nhanh chóng để chuyển đổi int thành chuỗi trong java: user.getUserAccountId()+""vì điều này sẽ tạo ra các đối tượng không cần thiết được thu thập. Xem xét sử dụng String.valueOf(user.getUserAccountId), hoặc Integer.toString(user.getUserAccountId)thay vào đó.
pkk

5
@Andrew S Đây có phải là web không? Đây là kết quả số một cho "lấy dữ liệu từ ý định"
McGuile

@AndrewS Tôi đồng ý với McGuile. Ngoài ra, câu hỏi này đã được đăng cách đây một thời gian vì vậy câu trả lời có lẽ không dễ tìm lại sau đó. Và nếu một câu hỏi tương tự chưa được đăng lên SO, thì đó là một bài viết hợp lệ.
0xCoder

Câu trả lời:


1212

Trước tiên, hãy lấy ý định đã bắt đầu hoạt động của bạn bằng getIntent()phương pháp:

Intent intent = getIntent();

Nếu dữ liệu bổ sung của bạn được biểu diễn dưới dạng chuỗi, thì bạn có thể sử dụng intent.getStringExtra(String name)phương thức. Trong trường hợp của bạn:

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

6
từ đâu đến tôi có thể tất cả phương pháp này ??
Adham

46
@adham: Nếu bạn đang ở trong một hoạt động, từ bên trong onCreate, bạn gọi getIntent().getStringExtra("id");để lấy chuỗi id
ccheneson

1
Bạn có thể có được ý định bắt đầu hoạt động của bạn bằng cách gọi getIntent()phương thức. Tôi đã cập nhật câu trả lời.
Malcolm

1
@Eatlon Nếu bạn gặp vấn đề với một thư viện cụ thể, bạn nên tạo một câu hỏi riêng về điều đó.
Malcolm

1
@MelColm Sự khác biệt giữa getExtra (). GetString và getStringExtra () là gì?
Amit Tripathi

188

Trong hoạt động tiếp nhận

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

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

6
Tại sao điều này lại thích hợp hơngetStringExtra?
IgorGanapolsky 2/10/2015

6
Tôi đoán là: nếu các tính năng bổ sung có thể null, toàn bộ phần tìm nạp có thể được bỏ qua. Bằng cách sử dụng getStringExtra, về cơ bản, bạn thay đổi nó thành một loạt if(extras != null) { return extras.getString(name) }. Một cho mỗi getStringExtrabạn gọi. Tùy chọn này sẽ kiểm tra nullmột lần và nếu vậy, nó sẽ không bận tâm đến việc đọc Bundletất cả. Bên cạnh đó, getStringExtracó lẽ sẽ tiếp tục hỏi getExtrasnội bộ mỗi lần là tốt. Vì vậy, bạn chỉ cần có nhiều cuộc gọi đến chức năng.
Daniël Sonck

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

Thêm vào

Đặt dữ liệu

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

Lấy dữ liệu

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

17

Thay vì khởi tạo một Ý định mới khác để nhận dữ liệu, chỉ cần thực hiện việc này:

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

11

Nếu được sử dụng trong FragmentActivity, hãy thử điều này:

Trang đầu tiên mở rộng FragmentActivity

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

Trong đoạn, bạn chỉ cần gọi getActivity()trước,

Trang thứ hai mở rộng Fragment :

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

1
Ngoài ra, bạn có thể sử dụng getStringExtra ("name") thay vì getExtras (). GetString ("name")
Plot

7

Nếu bạn đang cố gắng lấy thêm dữ liệu theo từng mảnh thì bạn có thể thử sử dụng:

Đặt dữ liệu bằng cách sử dụng:

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

Nhận dữ liệu bằng cách sử dụng:

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

Bạn có thể nhận được bất kỳ loại dữ liệu bổ sung nào từ ý định , bất kể đó là đối tượng hay chuỗi hoặc bất kỳ loại dữ liệu nào.

Bundle extra = getIntent().getExtras();

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

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

giải pháp ngắn nhất là:

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

4

** Đặt dữ liệu theo ý định - **

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

** Nhận dữ liệu theo ý định - **

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

nếu chúng ta gửi giá trị Integer bằng Intent. khi chúng ta phải sử dụng tham số thứ 2 0 trong getIntent (). getIntExtra ("inst acadId", 0) nếu không chúng ta không sử dụng 0 thì android sẽ báo lỗi cho tôi.


2

Kotlin

Hoạt động đầu tiên

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

Hoạt động thứ hai

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

Gợi ý

Luôn đặt các khóa trong tệp không đổi để quản lý nhiều hơn.

companion object {
    val PUT_EXTRA_USER = "PUT_EXTRA_USER"
}

1

Chỉ là một gợi ý:

Thay vì sử dụng "id" hoặc "name" trong i.putExtra ("id" .....) của bạn, tôi sẽ đề xuất, khi có ý nghĩa, sử dụng các trường tiêu chuẩn hiện tại có thể được sử dụng với putExtra (), tức là Ý định.EXTRA_s Something.

Một danh sách đầy đủ có thể được tìm thấy tại Intent (Nhà phát triển Android).


1

Chúng ta có thể làm điều đó bằng các phương tiện đơn giản:

Trong FirstActivity:

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

Trong 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

Truyền đạt ý định với giá trị cho Hoạt động đầu tiên:

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

Nhận ý định về Hoạt động thứ hai; -

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

Chúng tôi thường sử dụng hai phương pháp trong ý định gửi giá trị và nhận giá trị. Đối với việc gửi giá trị, chúng tôi sẽ sử dụng intent.putExtra("key", Value);và trong quá trình nhận ý định về hoạt động khác chúng tôi sẽ sử dụng intent.getStringExtra("key");để có được những dữ liệu ý định như Stringhay sử dụng một số phương pháp có sẵn khác để có được các loại dữ liệu ( Integer, Boolean, vv). Khóa có thể là bất kỳ từ khóa nào để xác định giá trị có nghĩa là giá trị bạn đang chia sẻ. Hy vọng nó sẽ làm việc cho bạn.


0

Bạn cũng có thể làm như thế này
// đặt giá trị trong ý định

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

// lấy giá trị từ ý định

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

0

Nhận các loại khác nhau từ ý định

Để truy cập dữ liệu từ Intent, bạn nên biết hai điều.

  • CHÌA KHÓA
  • DataType của dữ liệu của bạn.

Có các phương thức khác nhau trong lớp Intent để trích xuất các loại dữ liệu khác nhau. Có vẻ như thế này

getIntent (). XXXX (KEY) hoặc ý định.XXX (KEY);


Vì vậy, nếu bạn biết kiểu dữ liệu của varibale mà bạn đặt ở chế độ khác, bạn có thể sử dụng phương thức tương ứng.

Ví dụ để truy xuất Chuỗi trong Hoạt động của bạn từ Ý định

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

Danh sách các biến thể khác nhau của các phương thức cho loại dữ liệu khác nhau

Bạn có thể xem danh sách các phương thức khả dụng trong Tài liệu chính thức của ý định .


0

Đây là cho bộ điều hợp, cho hoạt động bạn chỉ cần thay đổi mContext thành tên Activty của bạn và cho đoạn bạn cần thay đổi mContext thành 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

Tôi chỉ đăng một câu trả lời ở đây bao gồm chủ đề này chi tiết hơn một chút, bao gồm một số lựa chọn thay thế.

Nó sử dụng Vapor API , một khung Android mới lấy cảm hứng từ jQuery mà tôi đã viết để đơn giản hóa nhà phát triển Android. Kiểm tra ví dụ trong câu trả lời đó để biết cách bạn có thể dễ dàng truyền dữ liệu giữa các hoạt động.

Ngoài ra, nó cho thấy VaporIntent, cho phép bạn thực hiện các cuộc gọi phương thức và sử dụng .put(...)phương thức quá tải :

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

Bạn có thể dễ dàng truyền dữ liệu xung quanh toàn bộ ứng dụng của mình bằng API Vapor , vì vậy, hy vọng nó sẽ hữu ích cho bạn và những người khác trong quá trình phát triển ứng dụng.


1
tôi đã thấy một số câu trả lời của bạn về API Vapor. Thật thú vị. Làm thế nào để bạn có được những dữ liệu đó (như Intent.getextras ()) ??
Kalai.G

Kiểm tra này , nó giải thích làm thế nào để lấy bổ sung ý định. Thêm chi tiết ở đây . cái đó có giúp ích không?
Darius

2
Tôi nghĩ rằng phương pháp xích có quá nhiều chi phí. Nếu bạn đang gọi bất kỳ phương thức nào trả về "này" chỉ để có thể kết nối được (tức là "setters") thì đó là vi phạm các nguyên tắc thiết kế của OOP. Tôi thích sự đơn giản, nhưng gỡ lỗi cũng có thể là một nỗi đau nếu bạn có một chuỗi các phương pháp. Tôi thấy giá trị trong API, tôi chỉ không đồng ý với phương thức xâu chuỗi.
nckbrz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.