Yêu cầu và quy trình
– Version: Androidx
– Ý tưởng: Tạo 2 activity đặt là ActivityCha và ActivityCon. Trên layout ActivityCha tạo 1 nút bấm để khi bấm vào thì gọi ActivityCon. Khi bấm nút back trên điện thoại thì mặc định là sẽ tự finish ActivityCon và hiển thị ActivityCha. Khi đó, bạn có thể truyền dữ liệu từ ActivityCon ngược trở lại ActivityCha.
Thực hiện:
Bước 1:
Tạo 2 activity như trong ý tưởng, tạo nút bấm trong ActivityCha (là activity chạy trước nhé) và nút bấm bên trong layout của ActivityCha. Code nút bấm như sau:
<button android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:onclick="OpenActivityCon"
android:text="Mở Activity con"
/>
Bước 2:
Bên trong file java của ActivityCha, khai báo một thuộc tính ở phạm vi class:
ActivityResultLauncher toolActivityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback() {
@Override
public void onActivityResult(ActivityResult result) {
Log.d(TAG, "onActivityResult: " + result.toString()); // dòng này là in toàn bộ dữ liệu ra để xem
Log.d(TAG, "onActivityResult: " + result.getResultCode()); // dòng này để xem cái code mà bên activityCon đánh dấu trả lại là gì
Log.d(TAG, "onActivityResult: hoTen = " + result.getData().getStringExtra("hoTen")); // dòng này là lấy dữ liệu từ ActivityCon trả lại thông qua Intent.
}
});
Giải thích chút trong code trên, toolActivityResultLauncher là một thuộc tính sau này có thể dùng để gọi bất kỳ activity nào nếu bạn muốn nhận lại dữ liệu.
Hàm onActivityResult là hàm callback khi ActivityCon mà trả lại dữ liệu thì sẽ tự động gọi lại hàm này.
Sau đó bạn viết 1 đoạn code ở menu hoặc nút bấm nào đó cũng được dùng để mở Activity con. Ví dụ này thì bạn tạo 1 hàm OpenActivityCon (View view) {….}ở trong file MainActivity và cho code dưới đây vào :
Intent intent = new Intent(this, ActivityCon.class);
toolActivityResultLauncher.launch(intent);
Log.d(TAG, "OpenAct2: " );
Bước 3:
Trong file Java của ActivityCon bạn overwrite lại hàm onBackPressed. Hàm này được gọi khi bạn bấm nút back trên điện thoại.
@Override
public void onBackPressed() {
Intent i = getIntent();
i.putExtra("hoTen" ,"Dev Mobile Chấm NÉT"); // khai báo biến kiểu intent để gửi dữ liệu sang activity cha
setResult(Activity.RESULT_OK,i); // lệnh này là để gửi dữ liệu, tham số thứ nhất là biến cờ trả lại trạng thái
super.onBackPressed(); // cái này phải để dưới cuối
}
Bước 4:
Chạy thử debug và thực hiện bấm nút để gọi ActivityCon sau đó bấm nút back trên điện thoại để tắt ActivityCon và xem logcat để kiểm tra kết quả nhé.
Bước 5:
Nếu ActivityCon bạn có dùng nút back ở trên ActionBar thì bạn làm thêm bước sau:
Trong hàm onCreate bạn thêm đoạn code sau:
getSupportActionBar().setDefaultDisplayHomeAsUpEnabled(true); // dòng này có thể bỏ qua
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Viết thêm hàm onOptionsItemSelected
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if(item.getItemId() == android.R.id.home)
this.onBackPressed();
return super.onOptionsItemSelected(item);
}
Và chạy lại bước 4 nhưng không bấm nút back trên điện thoại mà bấm vào nút mũi tên quay ngược lại trên actionbar của ActivityCon.
Chúc các bạn thử nghiệm thành công!