2

当跨三个选项卡创建相同的片段时,我很难理解片段的生命周期。每个片段中的主要小部件是一个 EditText 对象,该对象在我创建的类中进行跟踪,每个选项卡一个,在我的应用程序首次执行时创建。当应用程序执行输入(由屏幕上的按钮提供,而不是键盘提供)时,会将文本设置到第二个选项卡的 EditText 中。

输入似乎getItem()在我的FragmentPagerAdapter. 我知道getItem()创建选项卡时会调用两次,这是完全正常的行为,但我不明白这是我的代码设计的焦点问题还是逻辑问题(我希望是前者)。可能与instantiate()被退回有关getItem()吗?一旦被调用,焦点是否总是跟随它,因为我的片段instantiate()中有这行代码?onCreateView()

active.editLine = (EditText) v.findViewById(R.id.display);
// active is the currently active object of my app's class.

我怀疑instantiate()导致我的错误的原因是因为当我通过文本增加页面呈现时setOffscreenPageLimit(2)被发送到第三个选项卡。

在这一点上,我试图跟踪发生了什么,这是一个很好的教育练习。我在挣扎中发现这可能是一个焦点问题——但是我在清除焦点和设置焦点方面的尝试似乎没有得到应用,我什至不确定这是否是根本问题。我最终使用active.editLine.debug(0)来查看焦点是否丢失或获得,而事实并非如此。我阅读了一些相当流行的帖子,并把注意力从我的 XML 上移开,但这也无济于事。

只是为了确定,我应该在哪里设置我的 EditText 对象?在OnCreateView()我的片段中?这就是上述代码当前所在的位置。我在我的活动中创建自定义类的三个对象作为全局变量。在我认为适合我代码的区域中,我有 getter 和 setter。上面的代码是否应该存在于onCreate()我的片段中?如果您认为这是一个焦点问题,那么关闭焦点并仅在我需要时使用它的公认方法是什么?更重要的是,当我的应用程序第一次运行时,我在哪里打开焦点?在运行两次以呈现前两个选项卡OnTabSelected()之前调用。getItem()那么,如果我在全球范围内关闭它,我将在哪里获得最初的关注?可以用一种监听器设置焦点吗?

4

1 回答 1

1

不完全确定您要在这里做什么,但这里有一些建议:

  • 让您的全局活动对象存在于主要活动中并getActivity().someObject从您的片段中调用
  • findViewById()将向下搜索视图层次结构,直到找到第一个实例R.id.display
  • 在您使用片段事务提交片段视图之前,您的片段视图将不可用,这意味着他们的视图在那个时间之前也将不可用
  • 您正在通过调用“确定”findViewById()某些视图vv.findViewById()
  • 如果您正在通过片段分页,也许尝试在片段的onResume()方法中设置您的活动视图
  • 片段的onCreateView()方法只被调用一次。This will be called between onCreate(Bundle) and onActivityCreated(Bundle).
于 2013-07-25T05:48:20.550 回答