Bắt đầu một Hoạt động với một tham số


292

Tôi rất mới về phát triển Android.

Tôi muốn tạo và bắt đầu một hoạt động để hiển thị thông tin về một trò chơi. Tôi cho thấy thông tin tôi cần một gameId.

Làm cách nào tôi có thể chuyển ID trò chơi này cho hoạt động? ID trò chơi là hoàn toàn cần thiết vì vậy tôi không muốn tạo hoặc bắt đầu hoạt động nếu nó không có ID.

Giống như hoạt động chỉ có một hàm tạo với một tham số.

Làm thế nào tôi có thể làm điều đó?

Cảm ơn.

Câu trả lời:


506

Đặt một intcái là id của bạn vào cái mới Intent.

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
Bundle b = new Bundle();
b.putInt("key", 1); //Your id
intent.putExtras(b); //Put your id to your next Intent
startActivity(intent);
finish();

Sau đó lấy id trong mới của bạn Activity:

Bundle b = getIntent().getExtras();
int value = -1; // or other values
if(b != null)
    value = b.getInt("key");

42
Bạn có thể muốn đảm bảo b! = Null trước khi bạn bắt đầu lấy từ nó
Andrew

Làm thế nào "b" có thể là null trong hoạt động thứ hai trong mã này? Tôi nhận được b là null trên phương thức tạo hoạt động thứ hai.
Murat Çorlu

3
B có thể là null, giả sử bạn muốn bắt đầu hoạt động này từ nơi khác và bạn thực hiện theo cách tiêu chuẩn, không có thông số. Nó sẽ ném một NPE. Bạn nên luôn luôn xem xét các thông số này tùy chọn.
Gaspar de Elias

53
Không cần thiết phải tạo một Gói mới (và nếu bạn làm tài liệu nói rằng bạn "phải" sử dụng tên gói để tiền tố các khóa của bạn.) Chỉ cần sử dụng intent.putExtra(String, Int).
Sam

1
Người ta có thể lập luận rằng tốt hơn hết là không nên kiểm tra null. vi.wikipedia.org/wiki/Fail-fast .
setholopolus

124

Chỉ cần thêm dữ liệu bổ sung vào Mục đích bạn sử dụng để gọi hoạt động của mình.

Trong hoạt động của người gọi:

Intent i = new Intent(this, TheNextActivity.class);
i.putExtra("id", id);
startActivity(i);

Bên trong onCreate () của hoạt động bạn gọi:

Bundle b = getIntent().getExtras();
int id = b.getInt("id");

1
Có thể vượt qua trong một loại đối tượng tùy chỉnh?
Amyth

1
@Amyth Không, bạn phải sử dụng một gói như trong câu trả lời được chấp nhận.
AtlasRider


38

Tôi thích làm điều đó với một phương thức tĩnh trong hoạt động thứ hai:

private static final String EXTRA_GAME_ID = "your.package.gameId";

public static void start(Context context, String gameId) {
    Intent intent = new Intent(context, SecondActivity.class);
    intent.putExtra(EXTRA_GAME_ID, gameId);
    context.startActivity(intent);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    ... 
    Intent intent = this.getIntent();
    String gameId = intent.getStringExtra(EXTRA_GAME_ID);
}

Sau đó, từ hoạt động đầu tiên của bạn (và cho bất kỳ nơi nào khác), bạn chỉ cần làm:

SecondActivity.start(this, "the.game.id");

Chính xác những gì tôi đang tìm kiếm! Cảm ơn bạn
Matteo

1
Trong phương thức onCreate không String gameId = intent.getStringExtra(EXTRA_EXTERNAL_ID);nênString gameId = intent.getStringExtra(EXTRA_GAME_ID);
marcusshep

Có số liệu thống kê sẽ làm cho thử nghiệm của bạn rất khó khăn.
John Tribe

Đây có phải là một bộ nhớ bị rò rỉ? Truyền bối cảnh vào một phương thức tĩnh có vẻ như là một ý tưởng tồi đối với tôi. Tại sao không trả lại ý định và sau đó bắt đầu hoạt động bằng cách sử dụng ý định đó từ lớp đầu tiên?
AndroidDev 17/12/18

4

Mã Kotlin:

Bắt đầu SecondActivity:

startActivity(Intent(context, SecondActivity::class.java)
    .putExtra(SecondActivity.PARAM_GAME_ID, gameId))

Lấy Id trong SecondActivity:

class CaptureActivity : AppCompatActivity() {

    companion object {
        const val PARAM_GAME_ID = "PARAM_GAME_ID"
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val gameId = intent.getStringExtra(PARAM_GAME_ID)
        // TODO use gameId
    }
}

nơi gameIdString? (có thể null)


3

Các câu trả lời hiện có (chuyển dữ liệu trong Intenttruyền đến startActivity()) hiển thị cách thông thường để giải quyết vấn đề này. Có một giải pháp mà có thể được sử dụng trong trường hợp lẻ nơi bạn đang tạo Hoạt động này sẽ được bắt đầu bởi một ứng dụng (ví dụ, một trong những hoạt động chỉnh sửa trong một Tasker plugin) và do đó không kiểm soát Intentmà ra mắt các Activity.

Bạn có thể tạo một lớp cơ sở Activitycó một hàm tạo với một tham số, sau đó một lớp dẫn xuất có một hàm tạo mặc định gọi hàm tạo của lớp cơ sở với một giá trị, như vậy:

class BaseActivity extends Activity
{
    public BaseActivity(String param)
    {
        // Do something with param
    }
}

class DerivedActivity extends BaseActivity
{
    public DerivedActivity()
    {
        super("parameter");
    }
}

Nếu bạn cần tạo tham số để truyền cho hàm tạo của lớp cơ sở, chỉ cần thay thế giá trị được mã hóa cứng bằng một lệnh gọi hàm trả về giá trị đúng để truyền.

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.