从自定义视图更新Android UI

时间:2016-06-11 10:41:15

标签: android layout-inflater custom-view

我是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对象,但不确定这样做的正确方法。

非常感谢任何处理相同问题的现有帖子的帮助或指针。

1 个答案:

答案 0 :(得分:0)

我不清楚你要用AnimatedView做什么,所以我无法给你一个关于它如何正常工作的真正解决方案,只是你的问题在这里。如果这是您的完整实现,您应该尝试在活动本身中实现它的行为。

在您发布的Runnable中,您可以从XML中扩展您的布局。这意味着您创建新的布局和视图,并将这些布局和视图分配给您的本地变量。这些视图不是活动中显示的布局层次结构的一部分。因此,当您更新TextView的文本时,您将永远不会在任何地方看到任何更改。

作为旁注:使用postDelayed(Runnable, long)而不是创建新的Thread