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 事件处理程序,否则它们可能会意外触发(例如在重新加载视图时,尤其是如果TextViewTabHost/@987654328 内@)。【参考方案3】:

我在 2021 年遇到了这个问题。我只需要在设置文本之前再次调用 findViewById。

    myEditText = (EditText)view.findViewById(R.id.myEditText);
    myEditText.setText(String.valueOf(newValue));

【讨论】:

以上是关于Android片段中的EditText值不刷新的主要内容,如果未能解决你的问题,请参考以下文章

ListView 仅在刷新后显示项目

从android eclipse中的片段刷新或更新listadapter

片段中的Android ListView - 获取新数据后刷新表的问题

片段问题中的 NullPointerException

当sqlite android片段中的数据更改或删除时如何刷新recyclerview?

android - 如何将 int 转换为字符串并将其放在 EditText 中?