我是新手,目前正在学习java。
在我的Fragment
上打开MainActivity
后,我想更改Fragment
中的视图。
我注意到我不能像我在findViewById(R.id.viewNameInXml)
中那样自由选择使用MainActivity
。搜索了一段时间后,我找到了解决方案来获取对视图的引用:
我必须将onCreate()
的{{1}}方法更改为以下内容:
Fragment
我的问题是:为什么我只能以这种方式访问View inf = inflater.inflate(R.layout.fragment_name, container, false);
TextView tv = (TextView)
inf.findViewById(R.id.textViewIdXml);
zv.setText("new text");
return inf;
?请记住,我是初学者,所以请尽量保持简单 -
答案 0 :(得分:2)
并不是说您只能在onCreateView
中访问它,而且此方法是使用findViewById()
并保存对其中某些视图的引用的便捷位置。您也可以使用onViewCreated
。
为什么这两种方法方便访问视图? Fragment
没有findViewById
方法,因此您需要一个View来调用该方法。在onCreateView
中,您已经在扩充视图层次结构,因此您拥有一个视图;在第二个中,视图层次结构的根视图作为方法参数传递,因此您再次拥有View。
在这两种方法之外,您可以通过调用Fragment
获取getView()
的根视图,但请注意,这可以返回null
,具体取决于何时因Fragment
生命周期而被调用。 (顺便说一下,上面的方法都是生命周期方法。)
答案 1 :(得分:1)
为什么我只能这样访问TextView
主要是因为你还要学习Java中的班级成员:)没有什么能阻止你将View inf;
移出onCreateView
。你只需要在那里分配它,但一旦完成,你可以在其他地方使用它。
答案 2 :(得分:0)
这是因为您需要从片段中放大的视图/布局中找到textview。在“活动”中,将布局设置为“活动”的内容,它会在内部扩大并保留相同内容的引用。因此,您可以在此处直接使用findViewById()
。
注意:将布局与活动结合使用是遗留解决方案,并且在引入Fragment之前就已使用。