在Tabs中访问EditText的奇怪行为

时间:2014-11-06 15:18:03

标签: android android-fragments tabs

我正在使用带有ViewpagerFragmentPagerAdapter的3个标签的可滑动标签布局。到目前为止,每个选项卡都包含一个只包含一个EditText的片段。在extends FragmentActivity我尝试访问其值的主要活动中,点击操作图标。只要第二个选项卡聚焦,下面主要活动的代码就可以正常工作。 Hower,当选项卡1或3聚焦时,活动会因NullPointerException而崩溃。片段类的代码及其布局是等效的。到目前为止,我无法弄清楚为什么这种方法的成功取决于标签位置。我很欣赏这方面的任何线索。

public boolean onOptionsItemSelected(MenuItem item) {
    edt1 = (EditText) viewpager.findViewById(R.id.editText1);
    edt2 = (EditText) viewpager.findViewById(R.id.editText2);
    edt3 = (EditText) viewpager.findViewById(R.id.editText3);
    int id = item.getItemId();
    if (id == R.id.action_save_new_flight) {
        String msg = edt1.getText().toString() + "\n" + 
            edt2.getText().toString() + "\n" + edt3.getText().toString();
        Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
    }
    return super.onOptionsItemSelected(item);
}

编辑:

我认为这里的问题是android只保留内存中的聚焦和相邻选项卡/布局。当选项卡1处于活动状态时,NPE发生在editText3(选项卡3)中,当选项卡3处于活动状态时,它发生在editText1(选项卡1)中。那么访问文本的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

默认情况下,视图寻呼机将仅保持实例化当前片段和每侧一个片段。当你在片段1上时,寻呼机中没有片段3的实例。

您可以使用寻呼机上的功能setOffscreenPageLimit更改此设置。但是你应该做的是从片段中保存数据库中的值,并在单击按钮时重新获取它们(当然不在ui线程中)。

直接从包含活动(或其他片段)访问片段的数据通常是个坏主意。将数据保存到数据库,使用意图或总线在活动/片段之间进行通信。