我正在使用带有Viewpager
和FragmentPagerAdapter
的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)中。那么访问文本的正确方法是什么?
答案 0 :(得分:0)
默认情况下,视图寻呼机将仅保持实例化当前片段和每侧一个片段。当你在片段1上时,寻呼机中没有片段3的实例。
您可以使用寻呼机上的功能setOffscreenPageLimit更改此设置。但是你应该做的是从片段中保存数据库中的值,并在单击按钮时重新获取它们(当然不在ui线程中)。
直接从包含活动(或其他片段)访问片段的数据通常是个坏主意。将数据保存到数据库,使用意图或总线在活动/片段之间进行通信。