由findViewById(int)检索的View操作未反映在UI上

时间:2015-05-06 10:39:38

标签: android layout

我完全不知道这里发生了什么。 Activity.findViewById(int)检索到的视图上的任何操作都不会反映在用户界面上。

字符串"立即设置此文本!" (见下文)应设置为文本标签的文本,但不是。它只显示初始文本,如布局XML文件中所定义。

LoadingScreen 类:

public class LoadingScreen extends Screen {

    private TextView textLabel;

    public LoadingScreen(Screen parent) {
        super(R.layout.screen_loading, parent);
        this.textLabel = (TextView) getActivity().findViewById(R.id.loading_text_label);
        this.textLabel.setText("Set this text now!");
    }
}

屏幕类:

public class Screen {

    private int layoutResourceId;
    private int contentResourceId;

    public Screen(int layoutResourceId, Screen parent) {
        this.layoutResourceId = layoutResourceId;
        this.parent = parent;
        loadLayout();
    }

    private void loadLayout() {
        if (this.parent == null) {
            this.uiManager.getActivity().setContentView(this.layoutResourceId);
        }
        else {
            View view = LayoutInflater.from(getActivity()).inflate(this.layoutResourceId, null);
            ViewGroup container = (ViewGroup) getActivity().findViewById(this.parent.contentResourceId);
            container.removeAllViews();
            container.addView(view);
        }
    }
}

此外,以下适用:

  • Activity.findViewById(int)不会抛出NullPointerException
  • 根据Looper.getMainLooper().getThread() == Thread.currentThread()返回true的事实,代码在UI线程上运行。

如何解决?

1 个答案:

答案 0 :(得分:0)

如果没有抛出NullPointerException,则意味着加载了内容视图,并且UI应该更新要更改的元素(例如,调用setText(CharSequence)来更改文本)。

上面的代码段看起来没问题。问题不在于片段,但是方法loadLayout()被调用两次这一事实导致了内容视图被重新加载的问题,将XML布局文件中的所有元素重置为其初始值(例如{ {1}} <TextView>}。