ฉันจะรับข้อมูลเพิ่มเติมจากเจตนาบน Android ได้อย่างไร


749

ฉันจะส่งข้อมูลจากกิจกรรมหนึ่ง (เจตนา) ไปยังกิจกรรมอื่นได้อย่างไร

ฉันใช้รหัสนี้เพื่อส่งข้อมูล:

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

82
Java side note: มันเป็นความคิดที่ดีที่จะ "stringify" จำนวนเต็มเช่นนั้น (โดยเฉพาะอย่างยิ่งสำหรับวัตถุประสงค์ตัวอย่าง) และน่าเสียดายที่มันถูกพิจารณาว่าเป็นวิธีที่ดีและรวดเร็วในการแปลง int เป็น string ใน java: user.getUserAccountId()+""เนื่องจากจะสร้างวัตถุที่ไม่จำเป็น ที่จะรวบรวม พิจารณาใช้String.valueOf(user.getUserAccountId)หรือInteger.toString(user.getUserAccountId)แทน
pkk

5
@Andrew S นี่ไม่ใช่เว็บเหรอ? นี่คือผลอันดับหนึ่งสำหรับ "รับข้อมูลจากเจตนา"
McGuile

@AndrewS ฉันเห็นด้วยกับ McGuile นอกจากนี้คำถามนี้ถูกโพสต์เมื่อไม่นานมานี้ดังนั้นคำตอบก็อาจจะหาได้ไม่ง่ายนัก และหากคำถามที่คล้ายกันยังไม่ได้โพสต์ไปที่ SO แสดงว่าเป็นโพสต์ที่ถูกต้อง
0xCursor

คำตอบ:


1211

ก่อนอื่นจงรับความตั้งใจที่เริ่มกิจกรรมของคุณโดยใช้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");จะได้รับสาย id
ccheneson

1
คุณสามารถรับเจตนาที่เริ่มกิจกรรมของคุณโดยgetIntent()วิธีการโทร ฉันได้อัพเดตคำตอบแล้ว
Malcolm

1
@Eatlon หากคุณมีปัญหากับห้องสมุดเฉพาะคุณควรสร้างคำถามแยกต่างหากเกี่ยวกับเรื่องนั้น
Malcolm

1
@ MelColm ความแตกต่างระหว่าง getExtra () คือ getString และ getStringExtra ()?
Amit Tripathi

188

ในการรับกิจกรรม

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

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

6
ทำไมสิ่งนี้จึงเป็นที่นิยมมากกว่าgetStringExtra?
IgorGanapolsky

6
การเดาของฉันคือ: ถ้ามีความสามารถพิเศษสามารถnullดึงการดึงข้อมูลทั้งหมดได้ โดยใช้คุณโดยทั่วไปเปลี่ยนเป็นชุดของgetStringExtra if(extras != null) { return extras.getString(name) }หนึ่งรายการสำหรับทุกครั้งที่getStringExtraคุณโทร ตัวเลือกนี้จะตรวจสอบnullเพียงครั้งเดียวและถ้าเป็นเช่นนั้นมันจะไม่รบกวนการอ่านBundleเลย นอกจากนั้นgetStringExtraอาจจะถามgetExtrasภายในทุกครั้งเช่นกัน ดังนั้นคุณเพียงแค่มีการโทรไปยังฟังก์ชั่นมากขึ้น
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

เพิ่มขึ้น

ตั้งค่าข้อมูล

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

แทนที่จะเตรียมใช้งาน Intent ใหม่ใหม่เพื่อรับข้อมูลเพียงทำสิ่งนี้:

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

ถ้าเราส่งค่าจำนวนเต็มโดยเจตนา เมื่อเราต้องใช้พารามิเตอร์ที่ 2 0 ในgetIntent (). getIntExtra ("instituteId", 0) มิฉะนั้นเราจะไม่ใช้ 0 แล้ว Android ให้ข้อผิดพลาดแก่ฉัน


2

Kotlin

กิจกรรมแรก

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)


1

เราสามารถทำได้โดยวิธีง่าย ๆ :

ใน FirstActivity:

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

ในกิจกรรมที่สอง:

    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

ได้รับประเภทที่แตกต่างจากความตั้งใจ

ในการเข้าถึงข้อมูลจากเจตนาคุณควรรู้สองสิ่ง

  • สำคัญ
  • ประเภทข้อมูลของข้อมูลของคุณ

มีวิธีการที่แตกต่างกันในชั้นเรียนเจตนาที่จะแยกประเภทข้อมูลที่แตกต่างกัน ดูเหมือนว่านี้

getIntent (). XXXX (KEY) หรือเจตนา XXX (KEY);


ดังนั้นหากคุณทราบประเภทข้อมูลของ varibale ที่คุณตั้งไว้ในกิจกรรมอื่น ๆ คุณสามารถใช้วิธีการที่เกี่ยวข้อง

ตัวอย่างเพื่อดึงข้อมูลสตริงในกิจกรรมของคุณจากเจตนา

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

ฉันเพิ่งโพสต์คำตอบที่นี่ซึ่งครอบคลุมหัวข้อนี้อย่างละเอียดยิ่งขึ้นรวมถึงทางเลือกอื่น

มันใช้Vapor APIซึ่งเป็นเฟรมเวิร์ก Android ใหม่ของ jQuery ที่ฉันเขียนขึ้นเพื่อทำให้ Android dev ง่ายขึ้น ลองดูตัวอย่างในคำตอบว่าคุณสามารถส่งผ่านข้อมูลระหว่างกิจกรรมได้อย่างไร

มันยังแสดงให้เห็นVaporIntentซึ่งช่วยให้คุณสามารถเชื่อมโยงวิธีการโทรและใช้.put(...)วิธีการโอเวอร์โหลด:

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

คุณสามารถส่งผ่านข้อมูลรอบ ๆ แอปพลิเคชันทั้งหมดของคุณได้อย่างง่ายดายโดยใช้Vapor APIดังนั้นหวังว่าจะเป็นประโยชน์กับคุณและผู้อื่นในระหว่างการพัฒนาแอป


1
ฉันได้เห็นคำตอบบางส่วนของคุณเกี่ยวกับ Vapor API มันน่าสนใจคุณจะรับข้อมูลเหล่านั้นได้อย่างไร (เช่น Intent.getextras ())?
Kalai.G

ลองดูสิ่งนี้มันจะอธิบายถึงวิธีการดึงค่า Intent พิเศษ รายละเอียดเพิ่มเติมที่นี่ มันช่วยได้ไหม
Darius

2
ฉันคิดว่าวิธีการผูกมัดมีค่าใช้จ่ายมากเกินไป หากคุณกำลังเรียกวิธีการใด ๆ ที่ส่งกลับ "นี่" เพื่อให้สามารถเชนได้ (เช่น "setters") นั่นเป็นการละเมิดหลักการออกแบบของ OOP ฉันชอบความเรียบง่าย แต่การดีบั๊กอาจเป็นความเจ็บปวดได้หากคุณมีวิธีการหลายอย่าง ฉันเห็นคุณค่าใน API ฉันไม่เห็นด้วยกับวิธีการผูกมัด
nckbrz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.