2013-07-21 16 views
10

Mam aplikację z dwiema czynnościami. Z głównego działania rozpoczynam działalność drugorzędną przy użyciu startActivityForResult(). Drugorzędna aktywność zwraca dane (w postaci obiektu Intent) do głównej aktywności. Na głównym działaniu mam metodę onActivityResult() do obsługi powrotu z działania drugorzędnego.Android UI: kiedy mogę bezpośrednio zmodyfikować widok?

W tej metodzie muszę zaktualizować View dla głównej aktywności (w celu odzwierciedlenia nowych wartości danych). Nie jawnie spawnuję żadnych wątków. Moje pytanie brzmi: czy mogę bezpośrednio zmodyfikować widok z metody onActivityResult(), czy też muszę umieścić zdarzenie w kolejce UI, aby to zrobić? Aby być bardziej precyzyjnym: czy mogę być pewny, że metoda onActivityResult() znajduje się w wątku interfejsu użytkownika i czy w takim przypadku mogę zapomnieć o kolejce interfejsu?

Odpowiedz

10
  1. Tak, możesz zmodyfikować widok w onActivityResult(). Możesz modyfikować widoki Activity w dowolnym czasie po wywołaniu setContentView() w onCreate(), o ile używasz wątku interfejsu użytkownika.

  2. Tak, onActivityResult() jest wywoływana w wątku interfejsu użytkownika. Dotyczy to wszystkich metod cyklu życia (onCreate(), onResume() itd.).

2

Funkcja onActivityResult() jest wykonywana w wątku interfejsu użytkownika, można zmodyfikować widok tej metody.

+0

Dziękujemy! A po zmodyfikowaniu widoku, czy muszę wywołać 'invalidate()'? Jestem trochę zdezorientowany, kiedy unieważnić() musi być nazywane –

+1

nie, nie trzeba wywoływać żadnej metody unieważnienia. –

+0

Dzięki @JeffreyBlattman –

0

Kiedy próbuję stworzyć i pokazać AlertDialog na onActivityResult() wraca z podjęciem zdjęcie, otrzymuję "android.view.WindowLeaked" Błąd android.view.WindowLeaked:

Aktywny com ... MainActivity wyciekło okno com.android.internal.policy.impl.PhoneWindow $ DecorView {37ac7e30 VE .... R ..... I. 0,0-1272,584}, który został pierwotnie dodany tutaj

jak tylko spróbuję pokazać okno dialogowe.

Uważam więc, że nie zawsze jest dobrze założyć, że OnActivityResult() działa w głównym wątku.

11

Chociaż onActivityResult jest na wątku Ui, może nie być wyświetlany jego interfejs użytkownika po zmodyfikowaniu w onActivityResult. Podejrzewam, że powodem jest przerysowanie elementów interfejsu użytkownika pod numerem onResume, które wymuszają resetowanie elementów interfejsu użytkownika przez wywołanie resetViews() z ActivityTransitionState w super.onResume().

Miałem do czynienia z tym problemem, po prostu aktualizując EditText wewnątrz onActivityResult. EditText nie został zaktualizowany.

Obejście problemu polega na zapisaniu danych w numerze onActivityResult i aktualizacji interfejsu użytkownika pod numerem onResume poprzez ustawienie flagi pod numerem onActivityResult.

+0

Po prostu miałem piękną godzinę piekła. Dziękuję Ci! –

+0

to powinna być zaakceptowana odpowiedź –

0

W bieżącego fragmentuAddNewAccountFragment

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 na EditText w OnResume.

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

W docelowa FragmentChooseBankNameFragment

wykonywane poniżej onClick() in 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(); 
Powiązane problemy