android view.findViewById和activity.findViewById,一个无法显示数据

时间:2017-11-06 06:45:28

标签: android

我在view.findViewByIdactivity.findViewById之间遇到了问题。 简而言之,当我使用view.findViewById时,数据将无法显示且根本没有错误报告。当我使用activity.findViewById时,一切都很好。我不知道为什么或者我犯了什么错误。请给我一些建议。

MainActivity代码

public class MainActivity extends AppCompatActivity {
    ViewManager viewManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        viewManager=new ViewManager(this);
        viewManager.setText("hello");
    }
}

ViewManger代码

public class ViewManager {
    private AppCompatActivity activity;
    ViewManager(AppCompatActivity activity){
        this.activity=activity;
    }
    public void setText(String text){
        //in this way the word"hello" cannot be shown
        View view= LayoutInflater.from(activity).inflate(R.layout.activity_main,null);
        TextView textView=view.findViewById(R.id.tv);

        //this way it works but i dont know why i m wrong above
        //TextView textView=activity.findViewById(R.id.tv);

        textView.setText("hello");
    }
}

3 个答案:

答案 0 :(得分:1)

您正在创建一个单独的视图层次结构,该层次结构与您的活动布局没有任何关联,因此屏幕上不会发生任何事情

因此您可以将view引用设置为activity的布局

public void setText(String text){
    View view= LayoutInflater.from(activity).inflate(R.layout.activity_main,null);
    activity.setContentView(view);
    //^^^^^^^^^^^^^^^^^^^^^^
    TextView textView=view.findViewById(R.id.tv);

    //this way it works but i dont know why i m wrong above
    //TextView textView=activity.findViewById(R.id.tv);

    textView.setText("hello");
}

并且不再需要setContentView(R.layout.activity_main);

答案 1 :(得分:0)

您在未显示的布局中的视图上设置文本。在R.layout.activity_main中夸大ViewManger后,您永远不会将视图添加到活动本身膨胀的视图中(将布局作为参数传递给setContentView)。它与活动一起使用的原因是,在这种情况下,活动将查看setContentView传递的视图,即可见的布局。

答案 2 :(得分:0)

问题是您的活动布局已经通过使用此行进行了充气:

setContentView(R.layout.activity_main);

所以如果你打电话给活动:

TextView textView=findViewById(R.id.tv);
textView.setText("hello");

如果活动的布局,它将起作用于此视图的父级。 你在ViewManager中正在做的事情是膨胀一个没有绑定到任何组件的新视图。所以你想要显示文本View。 这将是解决方案:

 public void setText(String text){
    TextView textView=activity.findViewById(R.id.tv);
    textView.setText("hello");
}