2013-07-21 27 views
10

Tôi có một ứng dụng có hai hoạt động. Từ hoạt động chính, tôi bắt đầu hoạt động phụ sử dụng startActivityForResult(). Hoạt động thứ cấp trả về dữ liệu (dưới dạng đối tượng Intent) cho hoạt động chính. Trên hoạt động chính, tôi có phương thức onActivityResult() để xử lý việc quay lại từ hoạt động phụ.Giao diện người dùng Android: khi nào tôi có thể trực tiếp sửa đổi chế độ xem?

Trong phương thức onActivityResult() này, tôi cần cập nhật View trên hoạt động chính (để phản ánh giá trị dữ liệu mới). Tôi không rõ ràng sinh ra bất kỳ chủ đề nào. Câu hỏi của tôi là: tôi có thể sửa đổi trực tiếp chế độ xem từ trong phương thức onActivityResult() hay tôi cần đặt sự kiện trên hàng đợi giao diện người dùng để thực hiện? Để rõ ràng hơn: tôi có thể chắc chắn rằng phương thức onActivityResult() là trên chuỗi giao diện người dùng và trong trường hợp đó tôi có thể quên hàng đợi giao diện người dùng không?

Trả lời

10
  1. Có, bạn có thể sửa đổi chế độ xem trong onActivityResult(). Bạn có thể sửa đổi số lượt xem của Activity bất cứ lúc nào sau khi bạn gọi setContentView() trong onCreate(), miễn là bạn đang chạy trên chuỗi giao diện người dùng.

  2. Có, onActivityResult() được gọi trên chuỗi giao diện người dùng. Điều này đúng cho tất cả các phương pháp vòng đời (onCreate(), onResume(), v.v.).

2

OnActivityResult() được thực thi trong chuỗi giao diện người dùng, bạn có thể sửa đổi chế độ xem trên phương thức này.

+0

Cảm ơn bạn! Và sau khi sửa đổi khung nhìn, tôi có cần gọi 'invalidate()' không? Tôi là một chút bối rối như khi khi invalidate() cần phải được gọi là –

+1

không, bạn không cần phải gọi bất kỳ loại phương pháp không hợp lệ. –

+0

Cảm ơn @JeffreyBlattman –

0

Khi tôi cố gắng tạo ra và hiển thị một AlertDialog trên onActivityResult() trở về từ làm cho một bức ảnh, tôi nhận được một "android.view.WindowLeaked" lỗi android.view.WindowLeaked:

Hoạt động com ... MainActivity đã bị rò rỉ cửa sổ com.android.internal.policy.impl.PhoneWindow $ DecorView {37ac7e30 VE .... R ..... I. 0,0-1272,584} ban đầu được thêm tại đây

ngay sau khi tôi cố gắng hiển thị hộp thoại.

Vì vậy, tôi tin rằng không phải lúc nào cũng được giả định rằng OnActivityResult() chạy trên luồng chính.

11

Mặc dù onActivityResult là trên chuỗi Ui, bạn có thể không thấy giao diện người dùng của mình được cập nhật khi sửa đổi trong onActivityResult. Tôi nghi ngờ lý do là vẽ lại các phần tử Ui tại số onResume để buộc đặt lại các yếu tố ui bằng cách gọi resetViews() của ActivityTransitionState tại super.onResume().

Tôi gặp sự cố này khi chỉ cập nhật EditText bên trong onActivityResult. EditText không được cập nhật.

Giải pháp thay thế là lưu dữ liệu của bạn vào onActivityResult và cập nhật Ui tại onResume bằng cách đặt cờ trong onActivityResult.

+0

Tôi vừa có một giờ địa ngục đáng yêu. Cảm ơn bạn! –

+0

đây phải là câu trả lời được chấp nhận –

0

Trong hiện tại FragmentAddNewAccountFragment

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
     if (resultCode == RESULT_OK) { 
      if (requestCode == Constants.CHOOSE_BANK_REQUEST_CODE) { 
       bankName = data.getStringExtra("BANK_NAME"); 
       if (!TextUtils.isEmpty(bankName)) { 
        mChooseBankEdittext.setText(bankName); 
        mReceivedBankName = bankName; 
       } 
      } 
     } 
    } 

// if sending data from next fragment to previous fragment using OnActivityResult.

setText trên EditText trong OnResume.

@Override 
    public void onResume() { 
    super.onResume(); 
    mChooseBankEdittext.setText(bankName); 
    } 

Trong Target FragmentChooseBankNameFragment

thực hiện dưới đây onClick() trong Fragment

Intent intent = new Intent(getActivity(), AddNewAccountFragment.class); 
intent.putExtra("BANK_NAME", bankName); 
if (getFragmentManager().findFragmentByTag("AddNewAccountFragment") != null) 
      getFragmentManager().findFragmentByTag("AddNewAccountFragment").onActivityResult(Constants.CHOOSE_BANK_REQUEST_CODE, RESULT_OK, intent); 
getActivity().getSupportFragmentManager().popBackStack(); 
Các vấn đề liên quan