我有3个屏幕状态的片段;添加,编辑和查看。 在Add中,我创建一个实体并保存它。 下次我在View模式下打开它并使用
设置实体名称EditText entityName = (EditText) view.findViewById(R.id.entityName);
entityName.setText(entity.getEntityname());
我从“查看”模式中单击“编辑”按钮以打开“编辑”模式。我在这里更改实体名称并保存。这让我回到了视图屏幕。但我发现实体名称没有更新。
我调试并发现entity.getEntityname()
具有正确的值。我不确定编辑文本为什么不采用新值。
有什么想法吗?
注意:我使用的是Android 2.2版
答案 0 :(得分:80)
EditText似乎在重置onCreateView
中的文字时出现问题。因此,此处的解决方案是重置onResume
中的文本。这很有效。
onActivityCreated也存在问题。我在onStart中重置edittext的内容并且它可以工作。 [积分给@savepopulation]
答案 1 :(得分:5)
Android中有一些View类应该在分离容器时保存其状态。 应在View.onSaveInstanceState()之前调用Fragment.onViewCreated()。因此,如果您在方法Fragment.onViewCreated()中设置一个值。应该在方法View.onRestoreInstanceState(Parcelable state)中清除该值。
例如,类TextView,RecyclerView等。您可以阅读TextView.java的代码:
public Parcelable onSaveInstanceState() {
Parcelable superState = super.onSaveInstanceState();
// Save state if we are forced to
final boolean freezesText = getFreezesText();
boolean hasSelection = false;
int start = -1;
int end = -1;
....
if (freezesText || hasSelection) {
SavedState ss = new SavedState(superState);
....
}
....
}
有控制是否保存状态的参数:“freezesText”和“hasSelection”。 无法选择TextView,因此hasSelection为false。函数getFreezesText(),在类TextView中也返回false。 因此,TextView不会保存状态。 EditText.java的代码:
@Override
public boolean getFreezesText() {
return true;
}
EditText返回true,因此EditText应保存状态。
有一些方法可以解决这个问题:
1.Implement EditText.getFreezesText()并返回false,并清除EditText中的select状态
2.实现EditText的onSaveInstanceState,返回null.like this:
public Parcelable onSaveInstanceState() {
super.onSaveInstanceState();
return null;
}
3.使用EditText.setSaveEnable(false);
4.dd param in xml“saveEnable ='false'”
答案 2 :(得分:4)
如前所述,EditText似乎在onCreateView中重置文本时出现问题。
这是因为一旦创建了一个片段,直到我们从backstack中删除它,它的方法onResume将被调用,因为视图不会再次创建。
所以这里的解决方案是重置onResume中的文本。即使您在打开该片段或从另一个片段返回时锁定并解锁屏幕,这也会一直有效
但是,如果你从一个bundle中设置这个数据,那么实例变量中的值更好,因为bundle可能会变为null,你可以得到null指针问题
答案 3 :(得分:3)
onActivityCreated
也存在问题。我在onStart
中重置了edittext的内容,但它确实有效。
答案 4 :(得分:2)
根据@TusharVengrulekar,这就是你必须如何实现你的片段
public class ActionBar extends Fragment {
private TextView lbl_title;
private String title;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_action_bar, container, false);
title = "Contacts";
lbl_title = (TextView) view.findViewById(R.id.lbl_title);
return view;
}
@Override
public void onStart(){
super.onStart();
lbl_title.setText(title);
}
@Override
public void onResume(){
super.onResume();
}
}<!---->