2016-06-11 93 views
0

我是Android開發新手,仍然難以理解框架的工作原理。我嘗試寫一個簡單的遊戲來獲得一些經驗,我想請求下面的幫助。 在我的主要活動中,我有幾個TextViews來顯示我的遊戲中的各種數據,在那些我有一個名爲AnimatedView的自定義視圖中,它具有我爲遊戲本身繪製對象的畫布。基於Canvas上的對象,我想更新TextView以顯示例如對象的數量,玩家的等級等等。從自定義視圖更新Android UI

問題是,即使我可以用下面的代碼獲得TextView對象,當我調用textView.setText(...)時,沒有任何更改UI。

下面是我真正的代碼的簡化版本,來演示該問題:

activity_main.xml中

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    ... 
    tools:context="com.danielsh.test.teststuff.MainActivity" 
    android:orientation="vertical"> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/myTextView" 
     android:text="Change this!" /> 

    <com.danielsh.test.teststuff.AnimatedView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/animView" /> 

</LinearLayout> 

MainActivity.java

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 
} 

AnimatedView.java

public class AnimatedView extends View { 
    public AnimatedView(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     final Handler uiHandler = new Handler(); 
     final Runnable runnable = new Runnable() { 
      public void run() { 
       LayoutInflater inflater = LayoutInflater.from(getContext()); 
       LinearLayout layout = (LinearLayout) inflater.inflate(R.layout.activity_main, null, false); 
       TextView textView = (TextView) layout.findViewById(R.id.myTextView); 
       textView.setText("" + (System.currentTimeMillis()/1000)); 
       textView.invalidate(); 
      } 
     }; 

     uiHandler.postDelayed(runnable, 1000); 
    } 
} 

我認爲我不符合實際的TextView對象,對UI的可視工作,但不知道是什麼了這樣做的正確方法。

任何幫助或指向處理相同問題的現有職位的指針將不勝感激。

+0

您是否嘗試過'textView.invalidate();'設置好文字後 –

+0

@SatyenUdeshi textView.invalidate();對我沒有任何影響。 –

+0

@tynn handler.postDelayed()確實更好,不幸的是它有同樣的問題。 –

回答

0

我不清楚,你正在試圖用AnimatedView做什麼,所以我不能給你一個真正的解決方案,它將如何正確工作,只有在你這裏有什麼問題。如果這是你的完整實現,你應該嘗試在你的活動本身中實現它的行爲。

在您發佈的Runnable中,您從XML擴充佈局。這意味着你創建新的佈局和視圖,並將它們分配給你的本地變量。這些視圖不是活動中顯示的佈局層次結構的一部分。所以,當你更新TextView的文字時,你永遠不會在任何地方看到任何改變。

作爲旁註:使用postDelayed(Runnable, long)而不是創建新的Thread

+0

感謝您的更多解釋。你所說的證實了我的假設,即我沒有使用正確的視圖。 那麼如何從我的AnimatedView.java訪問activity_main.xml的視圖? (例如'TextView textView =(TextView)findViewById(R.id.myTextView);')'textView'始終爲空。 –

+0

@DanielSH如果'TextView'不是'AnimatedView'的視圖層次結構的一部分,你根本不應該訪問它。考慮在您的活動範圍內實施動畫。 – tynn

+0

謝謝,這是很有前途的。我重構了在MainActivity.java中執行更新的代碼,但由於某些原因,更新UI的代碼只運行一次。 我已更新我的示例,可以看到它有什麼問題嗎? –