2016-05-12 151 views
1

我有一個片段,通過意圖與onActivityResult(...)從DialogFragment獲取數據;從片段更新UI

我想更新片段的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()返回null – 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,我在這種情況下所做的是一個方法與reattachDialog(this)添加到我Callbacks,也許reattachDialog(DialogFragment dialogFragment)並調用它的onResume的DialogFragment的。

而在你的活動你這樣做:

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

或者在片段:

@Override 
public void reattachFragment(DialogFragment dialogFragment) { 
getActivity().setDialog(dialogFragment); 
}