Android片段中的EditText值不刷新
Posted
技术标签:
【中文标题】Android片段中的EditText值不刷新【英文标题】:EditText Values in Android Fragment do not refresh 【发布时间】:2012-10-10 19:52:05 【问题描述】:我正在使用Viewpager
在 3 个fragments
之间切换,一切正常,除了第二个选项卡(或fragment
)的刷新。在这个标签中,我有一张图片,一些静态的Textviews
,一些动态的TextViews
和一些EditText
字段。
每次选择第二个选项卡时,所有动态字段都会调用setText()
。 TextView 组件和微调器正在刷新和更新其内容,但 EditText 元素不会。
我不明白为什么这些字段没有更新。标签更改后,我在TabsAdapter
中调用notifiyDataSetChanged()
。每次我更改标签时,它都会调用onViewCreated()
。在第二个片段的onViewCreated()
中,我正在更改元素的内容。
这是我的片段的代码:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
hA = (HelloandroidActivity)this.getSherlockActivity();
appState = ((TestApplication)this.getSherlockActivity().getApplicationContext());
final PersistenceHelper pH = new PersistenceHelper(appState);
m = pH.readMitarbeiter(toDisplay);
// Inflate the layout for this fragment
v = inflater.inflate(R.layout.detailfragment, container, false);
if(m==null)
//If Mitarbeiter is empty
pH.closeDB();
return v;
//Inflating Elements
employeeName = (TextView)v.findViewById(R.id.employee_name);
cDate = (TextView)v.findViewById(R.id.department);
currentPlace = (TextView)v.findViewById(R.id.place_label);
comment_text = (EditText)v.findViewById(R.id.comment_text);
reachable = (EditText)v.findViewById(R.id.reachable_text);
state = (Spinner)v.findViewById(R.id.spinner_state);
durchwahl = (EditText)v.findViewById(R.id.durchwahl);
department = (EditText)v.findViewById(R.id.department_edit);
email = (EditText)v.findViewById(R.id.email_edit);
img = (ImageView)v.findViewById(R.id.userPic);
changeData = (Button)v.findViewById(R.id.changeButton);
//Setting Elements
employeeName.setText(m.getL_name());
currentPlace.setText(m.getStatus());
comment_text.setText(m.getBemerkung());
reachable.setText(m.getErreichbar());
email.setText(m.getS_name()+"");
durchwahl.setText(m.getDurchwahl()+"",TextView.BufferType.EDITABLE);
department.setText(m.getFunktion(),TextView.BufferType.NORMAL);
//Spinner
String[] values = "Anwesend", "Mittagspause" , "Ausser Haus" , "Dienstreise", "Krankenstand" ,"Zeitausgleich", "Urlaub","Abwesend" ;
ArrayAdapter spinnerArrayAdapter = new ArrayAdapter(this.getSherlockActivity(), android.R.layout.simple_spinner_item,values);
state.setAdapter(spinnerArrayAdapter);
state.setSelection(StateMapper.returnState(m.getStatus()));
//Image
//.......
return v;
正如我之前提到的,我的 Image、TextView 和 Spinner 元素正在刷新它们的内容。我还检查了所有变量的内容,一切似乎都很好,除了这些 EditText 元素。如果我将 EditText 元素转换为 TextView,则内容会发生变化(在代码中但不在 GUI 中)。让我绝望的是,EditText 在我第一次设置值时会刷新。
有人知道如何刷新EditText
字段的内容吗?
【问题讨论】:
【参考方案1】:我不确定,但请尝试 onResume()
并将您的文本设置为恢复状态。
或者试试
Intent.FLAG_ACTIVITY_CLEAR_TOP 在标签更改时。
【讨论】:
THX 在 onResume() 中设置值解决了问题.... 但是我不明白为什么我不能更改 onCreateView() 中的 EditText 值 如果将事件处理程序分配给相关的 TextView/EditText,也应该在 onResume() 中完成,否则也会出现缓存/更新问题。 我以前认为 recreate() 将完全重新运行一个活动作为一个新实例,这意味着所有视图都被刷新并重新加载任何新数据。然而,遗憾的是,在我多次重构我的代码之后我偶然发现了官方文档,然后是这篇文章。刷新视图的内容在 onResume() 中更可靠,正如这里所建议的那样。【参考方案2】:您也可以尝试向消息队列发布一个可运行文件,以便在渲染后更新 EditText(在 MonoDroid/C# 中,请参阅 How to run a Runnable thread in Android? for java):
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle)
EditText et = FindViewById<EditText>(...);
et.Post(() => et.Text = "content"; );
此外,如果您有一个 TextChanged 事件处理程序(例如,用于在文本更改时显示保存图标/按钮),请将其发布到可运行文件中,并在 et.Text 分配之后执行。否则,TextChanged 事件将在分配初始 et.Text 内容时触发,从而在 USER 未更改任何内容时触发 TextChanged 事件(即显示保存按钮):
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle)
EditText et = FindViewById<EditText>(...);
et.Post(() =>
et.Text = "content";
et.TextChanged += TextChangedHandler;
);
private void TextChangedHandler(object o, EventArgs args)
ShowSaveButton();
【讨论】:
确保在OnDestroy
中“取消注册”TextChanged
事件处理程序,否则它们可能会意外触发(例如在重新加载视图时,尤其是如果TextView
在TabHost
/@987654328 内@)。【参考方案3】:
我在 2021 年遇到了这个问题。我只需要在设置文本之前再次调用 findViewById。
myEditText = (EditText)view.findViewById(R.id.myEditText);
myEditText.setText(String.valueOf(newValue));
【讨论】:
以上是关于Android片段中的EditText值不刷新的主要内容,如果未能解决你的问题,请参考以下文章
从android eclipse中的片段刷新或更新listadapter
片段中的Android ListView - 获取新数据后刷新表的问题