2014-04-30 143 views
0

我試圖做一個簡單的任務,正在運行的任務之後更改視圖可見性,通過調用下面的代碼:片段getActivity()返回null

private void runTask(){ 
    Thread t = new Thread(new Runnable(){ 
     @Override 
     public void run(){ 
      boolean status = task(); 
      setVisibility(boolean); 
     } 
    }).start(); 
} 

public void setVisibility(final boolean status) { 
     getActivity().runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       if (status) { 
        myView.setVisibility(View.VISIBLE); 
       } else { 
        myView.setVisibility(View.GONE); 
       } 
      } 
     }); 
} 

問題是:任務我運行需要root(這工作正常),並在這一刻我的活動失去了重點,所以我的碎片是分離的,我的getActivity()返回null。執行根命令後,即使我的活動被帶到前面,但我的片段沒有重視它了,不再附加

而且,我嘗試使用

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    this.activity = activity; 
} 

我的片段,和而不是調用getActivity().runOnUiThread(),我打電話activity.runOnUiThread(),這仍然不起作用(代碼運行良好,它進入if/else語句,但在UI中沒有任何更改,我也嘗試在設置新的可見性後調用invalidate()

任何解決方案?

+0

'onAttach'被調用時,片段是**第一**附加到活動。我猜,它不會被調用兩次。另外,試着重新解釋你的問題,你做什麼以及你想達到什麼並不明顯。例如,「root command」是什麼意思?以root用戶身份執行任務?要不然? – Drew

+0

是的,以root用戶身份執行任務。這不是命令運行正常的問題。我試圖根據我的根任務的結果更新我的視圖可見性,它返回一個布爾值,然後在'setVisibility'方法中使用它。 – Wamasa

+0

爲什麼你發佈一個可運行的程序來改變視圖的可見性?你的整個'setVisibility'代碼可以簡化爲'myView.setVisibility(status?View.VISIBLE:View.GONE);'因此你不會遇到你的問題,因爲你不需要一個Activity。它將比創建一個新的Runnable對象並將其發佈到UI線程消息隊列更有效。 – Drew

回答

1

幾個可能性:

  1. 商店的標誌的狀態。如果活動已附加,請更改它,否則將其存儲。在onResume方法中設置可見性。
  2. 您可能可以使用View.post(),就像您使用Activity.runOnUiThread()一樣。
+0

在這些atm上工作。 – Wamasa

相關問題