如何在选项卡中使用单个片段中的EditText?

时间:2013-07-25 05:38:38

标签: android tabs android-fragments android-edittext fragment-tab-host

当在三个选项卡上创建相同的片段时,我很难理解片段的生命周期。每个片段中的主要窗口小部件是一个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)来查看焦点是否丢失或获得,但事实并非如此。我阅读了一些this fairly popular post并将我的注意力从我的XML中解脱出来,但这也无济于事。

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

1 个答案:

答案 0 :(得分:1)

不完全确定你的目的是什么,但这里有一些建议:

  • 让您的全局活动对象在主活动中生效,并从您的片段中调用getActivity().someObject
  • findViewById()将向下搜索视图层次结构,直到找到R.id.display的第一个实例
  • 在您使用片段事务提交片段视图之前,您的片段视图将不可用,这意味着他们的视图在此之前也不可用
  • 通过致电findViewById()
  • ,您正在v查看某个视图v.findViewById()
  • 如果您正在翻阅片段,也许可以尝试在片段onResume()方法中设置您的有效视图
  • 片段的onCreateView()方法只调用一次。 This will be called between onCreate(Bundle) and onActivityCreated(Bundle).