2016-05-12 86 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); 
}