วิธีเริ่มกิจกรรมใหม่เมื่อคลิกปุ่ม


626

ในแอปพลิเคชัน Android คุณจะเริ่มกิจกรรมใหม่ (GUI) อย่างไรเมื่อคลิกปุ่มในกิจกรรมอื่นและคุณส่งข้อมูลระหว่างกิจกรรมทั้งสองนี้อย่างไร

คำตอบ:


1116

ง่าย.

Intent myIntent = new Intent(CurrentActivity.this, NextActivity.class);
myIntent.putExtra("key", value); //Optional parameters
CurrentActivity.this.startActivity(myIntent);

ความพิเศษจะถูกดึงออกมาจากอีกด้านหนึ่งผ่าน:

@Override
protected void onCreate(Bundle savedInstanceState) {
    Intent intent = getIntent();
    String value = intent.getStringExtra("key"); //if it's a string you stored.
}

อย่าลืมเพิ่มกิจกรรมใหม่ของคุณใน AndroidManifest.xml:

<activity android:label="@string/app_name" android:name="NextActivity"/>

18
ส่วนคลิกของปุ่มอยู่ที่ไหน (ปุ่มคลิก→เปลี่ยนไปสู่กิจกรรมถัดไป)
จอนนี่

4
@ จอนนี่: นี่คือตัวอย่างของการคลิกปุ่ม stackoverflow.com/a/7722428/442512
Emmanuel

8
มีความแตกต่างระหว่างCurrentActivity.this.startActivity(myIntent)และstartActivity(myIntent)?
สับสน

5
ใช่แล้วฮ่า ๆ ง่าย มี codemissing มากกว่ารหัสที่พิมพ์จริง อินเตอร์เฟส xml ทั้งหมดและรหัส. java หายไปที่ไหน Downvote
Liquid Core

111
Liquid คุณต้องการให้เขาบรรจุเป็น apk ด้วยหรือไม่ ;)
Casey Murray

60

สร้างเจตนาต่อกิจกรรม ViewPerson และส่งผ่าน PersonID (สำหรับการค้นหาฐานข้อมูลเป็นต้น)

Intent i = new Intent(getBaseContext(), ViewPerson.class);                      
i.putExtra("PersonID", personID);
startActivity(i);

จากนั้นในกิจกรรม ViewPerson คุณจะได้รับชุดข้อมูลพิเศษตรวจสอบให้แน่ใจว่ามันไม่เป็นโมฆะ (ในบางครั้งถ้าคุณไม่ส่งข้อมูล) จากนั้นรับข้อมูล

Bundle extras = getIntent().getExtras();
if(extras !=null)
{
     personID = extras.getString("PersonID");
}

ตอนนี้ถ้าคุณต้องการแบ่งปันข้อมูลระหว่างสองกิจกรรมคุณสามารถมี Global Singleton ได้

public class YourApplication extends Application 
{     
     public SomeDataClass data = new SomeDataClass();
}

จากนั้นเรียกมันในกิจกรรมใด ๆ โดย:

YourApplication appState = ((YourApplication)this.getApplication());
appState.data.CallSomeFunctionHere(); // Do whatever you need to with data here.  Could be setter/getter or some other type of logic

58

คำตอบปัจจุบันดีมาก แต่จำเป็นต้องมีคำตอบที่ครอบคลุมมากขึ้นสำหรับผู้เริ่มต้น มี 3 วิธีในการเริ่มต้นกิจกรรมใหม่ใน Android และพวกเขาทั้งหมดใช้Intentคลาส เจตนา พัฒนา Android

  1. การใช้onClickคุณสมบัติของปุ่ม (เริ่มต้น)
  2. การกำหนดOnClickListener()ผ่านคลาสที่ไม่ระบุชื่อ (กลาง)
  3. วิธีการอินเตอร์เฟซกว้างกิจกรรมโดยใช้switchคำสั่ง (มือโปร)

นี่คือลิงค์ไปยังตัวอย่างของฉันหากคุณต้องการติดตาม:

1. การใช้onClickคุณสมบัติของปุ่ม (เริ่มต้น)

ปุ่มมีonClickแอตทริบิวต์ที่พบในไฟล์. xml:

<Button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="goToAnActivity"
    android:text="to an activity" />

<Button
    android:id="@+id/button2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="goToAnotherActivity"
    android:text="to another activity" />

ในคลาส Java:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_activity);
}

public void goToAnActivity(View view) {
    Intent intent = new Intent(this, AnActivity.class);
    startActivity(intent);
}

public void goToAnotherActivity(View view) {
    Intent intent = new Intent(this, AnotherActivity.class);
    startActivity(intent);
}

ข้อได้เปรียบ : ง่ายต่อการทำในทันทีโมดูลาร์และสามารถตั้งค่าหลายonClicks เป็นเจตนาเดียวกันได้อย่างง่ายดาย

ข้อเสีย : อ่านง่ายเมื่อตรวจสอบ

2. การกำหนดOnClickListener()คลาสที่ไม่ระบุชื่อ (กลาง)

นี่คือเมื่อคุณตั้งค่าแยกต่างหากsetOnClickListener()สำหรับแต่ละรายการbuttonและแทนที่แต่ละรายการonClick()ด้วยเจตนาของตัวเอง

ในคลาส Java:

@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);

        Button button1 = (Button) findViewById(R.id.button1);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(view.getContext(), AnActivity.class);
                view.getContext().startActivity(intent);}
            });

        Button button2 = (Button) findViewById(R.id.button2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(view.getContext(), AnotherActivity.class);
                view.getContext().startActivity(intent);}
            });

ข้อได้เปรียบ : ง่ายต่อการทำได้ทันที

ข้อเสีย : จะมีคลาสที่ไม่ระบุชื่อจำนวนมากซึ่งจะทำให้อ่านง่ายเมื่อตรวจสอบ

3. วิธีการอินเตอร์เฟซที่กว้างกิจกรรมโดยใช้switchคำสั่ง (มือโปร)

นี่คือเมื่อคุณใช้switchคำสั่งสำหรับปุ่มของคุณภายในonClick()วิธีการจัดการปุ่มทั้งหมดของกิจกรรม

ในคลาส Java:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_activity);

    Button button1 = (Button) findViewById(R.id.button1);
    Button button2 = (Button) findViewById(R.id.button2);
    button1.setOnClickListener(this);
    button2.setOnClickListener(this);
}

@Override
public void onClick(View view) {
    switch (view.getId()){
        case R.id.button1:
            Intent intent1 = new Intent(this, AnActivity.class);
            startActivity(intent1);
            break;
        case R.id.button2:
            Intent intent2 = new Intent(this, AnotherActivity.class);
            startActivity(intent2);
            break;
        default:
            break;
    }

ข้อได้เปรียบ : การจัดการปุ่มง่าย ๆ เพราะปุ่มทั้งหมดมีการลงทะเบียนในonClick()วิธีการเดียว


สำหรับส่วนที่สองของคำถามการส่งผ่านข้อมูลโปรดดูที่ฉันจะส่งผ่านข้อมูลระหว่างแอพพลิเคชั่นใน Android ได้อย่างไร


คำตอบที่ดีเยี่ยมขอบคุณ! คุณรู้เกี่ยวกับบทลงโทษโดยการใช้คำแนะนำใด ๆ หรือไม่?
lmedinas

3
# 3 ไม่ใช่ "pro" เป็นตัวเลือกที่สามารถอ่านได้และบำรุงรักษาน้อยที่สุดและจะได้รับการปรับเปลี่ยนเป็น # 1 หรือ # 2 โดยนักพัฒนาที่มีประสบการณ์คนแรกที่เห็นมัน (หรือพวกเขาจะใช้ Butterknife ซึ่งเป็นตัวเลือก # 1 ในสเตอรอยด์)
Kevin Krumwiede

ฉันคิดว่าโปรแกรมเมอร์มืออาชีพไม่ชอบ # 3 เลย วาง, Idk, ตัวจัดการคลิก 10 ปุ่มภายใน 1 วิธีเป็นฝันร้ายและไม่เป็นมืออาชีพเลย วิธีการที่มีรหัส zilion ไม่ได้ทำให้คุณเป็นมืออาชีพ KISS
Mehdi Dehghani

3 ไม่ใช่ "pro" อย่างแน่นอน
Kaiser Keister

36

เมื่อผู้ใช้คลิกที่ปุ่มโดยตรงภายใน XML เช่นนั้น:

<Button
         android:id="@+id/button"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="TextButton"
         android:onClick="buttonClickFunction"/>

การใช้คุณสมบัติที่android:onClickเราประกาศชื่อวิธีการที่จะต้องมีในกิจกรรมหลัก ดังนั้นฉันต้องสร้างวิธีการนี้ภายในกิจกรรมของเราดังนี้:

public void buttonClickFunction(View v)
{
            Intent intent = new Intent(getApplicationContext(), Your_Next_Activity.class);
            startActivity(intent);
}

19
Intent iinent= new Intent(Homeactivity.this,secondactivity.class);
startActivity(iinent);

2
นี่เป็นคำตอบบางส่วนเท่านั้น ยิ่งไปกว่านั้นมันไม่เพียงพอนั่นคือมันจะไม่ทำงานหากไม่มีการแก้ไขเพิ่มเติมในโครงการ
andr


8

เอ็มมานู,

ฉันคิดว่าควรใส่ข้อมูลเพิ่มเติมก่อนเริ่มกิจกรรมมิฉะนั้นข้อมูลจะไม่สามารถใช้ได้หากคุณเข้าถึงในวิธี onCreate ของ NextActivity

Intent myIntent = new Intent(CurrentActivity.this, NextActivity.class);

myIntent.putExtra("key", value);

CurrentActivity.this.startActivity(myIntent);

7

จากกิจกรรมการส่งให้ลองใช้รหัสต่อไปนี้

   //EXTRA_MESSAGE is our key and it's value is 'packagename.MESSAGE'
    public static final String EXTRA_MESSAGE = "packageName.MESSAGE";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
       ....

        //Here we declare our send button
        Button sendButton = (Button) findViewById(R.id.send_button);
        sendButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //declare our intent object which takes two parameters, the context and the new activity name

                // the name of the receiving activity is declared in the Intent Constructor
                Intent intent = new Intent(getApplicationContext(), NameOfReceivingActivity.class);

                String sendMessage = "hello world"
                //put the text inside the intent and send it to another Activity
                intent.putExtra(EXTRA_MESSAGE, sendMessage);
                //start the activity
                startActivity(intent);

            }

จากกิจกรรมที่ได้รับลองใช้รหัสต่อไปนี้:

   protected void onCreate(Bundle savedInstanceState) {
 //use the getIntent()method to receive the data from another activity
 Intent intent = getIntent();

//extract the string, with the getStringExtra method
String message = intent.getStringExtra(NewActivityName.EXTRA_MESSAGE);

จากนั้นเพิ่มรหัสต่อไปนี้ลงในไฟล์ AndroidManifest.xml

  android:name="packagename.NameOfTheReceivingActivity"
  android:label="Title of the Activity"
  android:parentActivityName="packagename.NameOfSendingActivity"




4

วิธีเริ่มต้นกิจกรรมใหม่คือการถ่ายทอดเจตนาและมีความตั้งใจเฉพาะประเภทที่คุณสามารถใช้เพื่อส่งผ่านข้อมูลจากกิจกรรมหนึ่งไปยังอีกกิจกรรมหนึ่ง คำแนะนำของฉันคือการที่คุณตรวจสอบเอกสารนักพัฒนา Android ที่เกี่ยวข้องกับเจตนา ; มันเป็นความมั่งคั่งของข้อมูลในหัวเรื่องและมีตัวอย่างด้วย


4

Kotlin

กิจกรรมแรก

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

กิจกรรมที่สอง

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

ข้อเสนอแนะ

วางกุญแจไว้ในไฟล์คงที่เสมอเพื่อการจัดการที่มากขึ้น

companion object {
    val PUT_EXTRA_USER = "user"
}
startActivity(Intent(this, SecondActivity::class.java)
  .putExtra(PUT_EXTRA_USER, "value"))

4

การเริ่มต้นกิจกรรมจากกิจกรรมอื่นเป็นสถานการณ์ที่พบได้บ่อยในหมู่แอปพลิเคชัน Android
ในการเริ่มกิจกรรมคุณต้องมีวัตถุเจตนา

จะสร้าง Intent Objects ได้อย่างไร?

วัตถุเจตนาใช้สองพารามิเตอร์ในตัวสร้าง

  1. บริบท
  2. ชื่อของกิจกรรมที่จะเริ่ม (หรือชื่อเต็มของแพ็คเกจ)

ตัวอย่าง:

ป้อนคำอธิบายรูปภาพที่นี่

ตัวอย่างเช่นถ้าคุณมีสองกิจกรรมพูดHomeActivityและDetailActivityและคุณต้องการเริ่มต้นDetailActivityจากHomeActivity (HomeActivity -> DetailActivity)

นี่คือข้อมูลโค้ดที่แสดงวิธีเริ่ม DetailActivity จาก

HomeActivity

Intent i = new Intent(HomeActivity.this,DetailActivity.class);
startActivity(i);

และคุณทำเสร็จแล้ว

กลับมาที่ปุ่มคลิกส่วนหนึ่ง

Button button = (Button) findViewById(R.id.someid);

button.setOnClickListener(new View.OnClickListener() {

     @Override
     public void onClick(View view) {
         Intent i = new Intent(HomeActivity.this,DetailActivity.class);
         startActivity(i);  
      }

});

3

เริ่มกิจกรรมอื่นจากกิจกรรมนี้และคุณสามารถส่งพารามิเตอร์ผ่าน Bundle Object ได้เช่นกัน

Intent intent = new Intent(getBaseContext(), YourActivity.class);
intent.putExtra("USER_NAME", "xyz@gmail.com");
startActivity(intent);

ดึงข้อมูลในกิจกรรมอื่น (YourActivity)

String s = getIntent().getStringExtra("USER_NAME");

2

ใช้อินเตอร์เฟส ViewOnClickListener และแทนที่เมธอด onClick

ImageView btnSearch;

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_search1);
        ImageView btnSearch = (ImageView) findViewById(R.id.btnSearch);
        btnSearch.setOnClickListener(this);
    }

@Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btnSearch: {
                Intent intent = new Intent(Search.this,SearchFeedActivity.class);
                startActivity(intent);
                break;
            }

2

แม้ว่าจะมีคำตอบที่เหมาะสม แต่ฉันมาที่นี่เพื่อค้นหาคำตอบในภาษา Kotlin คำถามนี้ไม่ได้เกี่ยวกับภาษาเฉพาะดังนั้นฉันกำลังเพิ่มรหัสเพื่อให้งานนี้สำเร็จในภาษา Kotlin

นี่คือวิธีที่คุณทำเช่นนี้ใน Kotlin สำหรับ Andorid

testActivityBtn1.setOnClickListener{
      val intent = Intent(applicationContext,MainActivity::class.java)
      startActivity(intent)

 }

2

วิธีที่ง่ายที่สุดในการเปิดกิจกรรมเมื่อคลิกปุ่มคือ:

  1. สร้างสองกิจกรรมภายใต้โฟลเดอร์ res เพิ่มปุ่มในกิจกรรมแรกและตั้งชื่อให้กับonclickฟังก์ชัน
  2. ควรมีไฟล์ java สองไฟล์สำหรับแต่ละกิจกรรม
  3. ด้านล่างเป็นรหัส:

MainActivity.java

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.content.Intent;
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void goToAnotherActivity(View view) {
        Intent intent = new Intent(this, SecondActivity.class);
        startActivity(intent);
    }
}

SecondActivity.java

package com.example.myapplication;
import android.app.Activity;
import android.os.Bundle;
public class SecondActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity1);
    }
}

AndroidManifest.xml (เพียงเพิ่มบล็อคโค้ดนี้ลงในที่มีอยู่เดิม)

 </activity>
        <activity android:name=".SecondActivity">
  </activity>

1

ใช้ปุ่มเป็น xml ก่อน

  <Button
        android:id="@+id/pre"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@mipmap/ic_launcher"
        android:text="Your Text"
        />

ทำ listner ของปุ่ม

 pre.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(MainActivity.this, SecondActivity.class);
            startActivity(intent);
        }
    });

1

เมื่อคลิกปุ่ม:

loginBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Intent intent= new Intent(getApplicationContext(), NextActivity.class);
        intent.putExtra("data", value); //pass data
        startActivity(intent);
    }
});

วิธีรับข้อมูลพิเศษจากNextActivity.class:

Bundle extra = getIntent().getExtras();
if (extra != null){
    String str = (String) extra.get("data"); // get a object
}

1

เขียนรหัสในกิจกรรมแรกของคุณ

button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {


Intent intent = new Intent(MainActivity.this, SecondAcitvity.class);
                       //You can use String ,arraylist ,integer ,float and all data type.
                       intent.putExtra("Key","value");
                       startActivity(intent);
                        finish();
            }
         });

ใน secondActivity.class

String name = getIntent().getStringExtra("Key");

1

วิดเจ็ตปุ่มสถานที่ในรูปแบบ xml ด้านล่าง

<Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Button"
/>

หลังจากนั้นเริ่มต้นและจัดการกับผู้ฟังคลิกในกิจกรรมเช่นด้านล่าง ..

ในกิจกรรมที่สร้างวิธี:

Button button =(Button) findViewById(R.id.button); 
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
       Intent intent = new 
            Intent(CurrentActivity.this,DesiredActivity.class);
            startActivity(intent);
    }
});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.