我在view.findViewById
和activity.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");
}
}
答案 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");
}