2016-05-12 3 views
1

У меня есть фрагмент, который получает данные из диалогового окна Dialog с помощью onActivityResult (...);Обновление UI от фрагмента

Я пытаюсь обновить интерфейс фрагмента, но runOnUiThread не работает.

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    ArrayList<Farm> farms = data.getParcelableArrayListExtra("farms_list"); 
    float totalArea = 0; 
    for(Farm farm : farms) { 
     if (farm.isSelected()) { 
      Log.d("farm", farm.getName()); 
      totalArea += farm.getArea(); 
     } 
    } 
    final float finalTotalArea = totalArea; 
    activity.runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      area.setText(String.valueOf(finalTotalArea)); 
     } 
    }); 
} 

Район TextView не обновляется.

Я получаю ссылку на деятельность с помощью метода onAttach().

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    if (!(context instanceof PageFragmentCallbacks)) { 
     throw new ClassCastException(
       "Activity must implement PageFragmentCallbacks"); 
    } 

    mCallbacks = (PageFragmentCallbacks) context; 
    this.activity = (Activity) context; 
} 
+0

Вы должны использовать 'getActivity.runOnUiThread (новый Runnable() {' –

+0

getActivity() возвращает нуль – Manos

+0

Когда вы говорите, что runOnUiThread() не работает, вы имеете в виду, что он вызывает ошибку или что он ничего не обрабатывает? – Amesys

ответ

0

onActivityResult вызывается в основном потоке. Подробнее here. По какой-то причине представления не могут быть отредактированы с помощью этого метода (возможно, не созданы или сделаны). Один трюк, который вы можете сделать, это установить var boolean updateTextView = false; В onActivityResult установите его на true, сохраните данные, которые у вас есть, и чем onResume проверьте updateTextView, и если true, установите данные в TextView.

+1

Nop я пробовал, он не работает – Manos

0

Как насчет того, чтобы попытаться обернуть его в нужную нить, которую вы запускаете впоследствии?

new Thread() { 
      public void run() { 
       try { 
        activity.runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          area.setText(String.valueOf(finalTotalArea)); 
         } 
        }); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    }.start(); 
0

Похоже, ваш Activity теряет свой Fragment где-то, что я сделал в этом случае должен был добавить метод к моему Callbacks, может быть reattachDialog(DialogFragment dialogFragment) и назвав его в onResume из DialogFragment с reattachDialog(this).

А в вашей деятельности вы это делаете:

@Override 
public void reattachFragment(DialogFragment dialogFragment) { 
this.dialogFragment = dialogFragment; 
} 

Или фрагмент:.

@Override 
public void reattachFragment(DialogFragment dialogFragment) { 
getActivity().setDialog(dialogFragment); 
} 
Смежные вопросы