我是Android开发的新手,并且仍然难以理解框架的工作原理。我尝试编写一个简单的游戏来获得一些经验,我想请求下面的帮助。 在我的主要Activity中,我有一些TextView来显示我游戏中的各种数据,在那些我有一个名为AnimatedView的自定义视图中,它有画布,我为游戏本身绘制了对象。根据Canvas上的对象,我想更新TextViews以显示例如对象的数量,玩家的等级等等。
问题是,即使我可以使用下面的代码获取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);
}
}
我假设我没有使用在UI上可见的实际TextView对象,但不确定这样做的正确方法。
非常感谢任何处理相同问题的现有帖子的帮助或指针。
答案 0 :(得分:0)
我不清楚你要用AnimatedView
做什么,所以我无法给你一个关于它如何正常工作的真正解决方案,只是你的问题在这里。如果这是您的完整实现,您应该尝试在活动本身中实现它的行为。
在您发布的Runnable
中,您可以从XML中扩展您的布局。这意味着您创建新的布局和视图,并将这些布局和视图分配给您的本地变量。这些视图不是活动中显示的布局层次结构的一部分。因此,当您更新TextView
的文本时,您将永远不会在任何地方看到任何更改。
作为旁注:使用postDelayed(Runnable, long)
而不是创建新的Thread
。