【问题标题】:EditText Settext not working with FragmentEditText Settext 不适用于片段
【发布时间】:2012-11-09 06:52:09
【问题描述】:

我有一个屏幕的 3 种状态的片段;添加、编辑和查看。 在添加中,我创建一个实体并保存它。 下次我在查看模式下打开它并使用

设置实体名称
EditText entityName = (EditText) view.findViewById(R.id.entityName);    
entityName.setText(entity.getEntityname());

我从查看模式单击编辑按钮以打开编辑模式。我在这里更改实体名称并保存。这让我回到了视图屏幕。但我发现实体名称没有更新。 我调试并发现entity.getEntityname() 具有正确的值。我不确定为什么编辑文本没有采用新值。

有什么想法吗?

注意:我使用的是安卓 2.2 版

【问题讨论】:

  • 片段需要 API 级别 11 或更高
  • @AndroidApple 我认为可以安全地假设他正在使用兼容性库 -_- 所以这样做并没有错 lmao
  • 是的,我正在使用兼容性库。

标签: android android-edittext


【解决方案1】:

EditText 似乎在重置 onCreateView 中的文本时出现问题。所以这里的解决方案是重置onResume中的文字。这行得通。

onActivityCreated 也有问题。我在 onStart 中重置了 edittext 的内容,它可以工作。 [感谢@savepopulation]

【讨论】:

  • 我刚遇到这个问题,注意到如果调用 onStart 也可以。值得注意的是,使用 TextView 可以按预期工作,但是一旦您开始使用 EditText 或 AutoCompleteTextView,您就会开始遇到这些问题。
  • 非常感谢您。你能解释一下为什么会出现这种类型的问题
  • 如果从OnActivityCreated 调用setText 也不起作用。非常感谢。花几个小时解决这个问题。
  • 难以置信!!这只花了我几个小时。有没有人将此作为错误报告给谷歌或者这是设计使然?我怀疑后者。
  • 这个解决方案节省了我的时间,我在这个问题上花了很多时间。
【解决方案2】:

Android 中有一些 View 类应该在它们的容器分离时保存它们的状态。 Fragment.onViewCreated() 应该在 View.onSaveInstanceState() 之前调用。所以如果你在方法 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.实现EditText.getFreezesText()并返回false,并清除EditText中select的状态

2.实现EditText的onSaveInstanceState,返回null。像这样:

 public Parcelable onSaveInstanceState() {
      super.onSaveInstanceState();
     return null;
 }

3.使用EditText.setSaveEnable(false);

4.在xml中添加参数“saveEnable='false'”

【讨论】:

  • 老兄,你救了我的命!
【解决方案3】:

如前所述,EditText 似乎在重置 onCreateView 中的文本时存在问题。

这是因为一旦创建了一个片段,直到我们将它从后台堆栈中删除,它的方法 onResume 将被调用,因为视图不会再次创建。

所以这里的解决方案是重置onResume中的文字。即使您在该片段打开或您从另一个片段返回时锁定和解锁屏幕,这将始终有效

但是,如果您从包中设置此数据,最好将该值保存在实例变量中,因为包可能为空,然后您可以解决空指针问题

【讨论】:

    【解决方案4】:

    根据@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();
    }
    }<!---->
    

    【讨论】:

    • 这是我从父 ViewController 获取 ActionBar 的常用方法
    【解决方案5】:

    onActivityCreated 中也存在问题。我在onStart 中重置了edittext 的内容,它可以工作。

    【讨论】:

      【解决方案6】:

      这将适用于片段 100%

        override fun onResume() {
          super.onResume()
          Handler(Looper.getMainLooper()).postDelayed({
             editText.setText("Abc")
          }, 500)
      
      }
      

      【讨论】:

      • 它适用于我的情况。不错的解决方案。
      【解决方案7】:

      onResume()onStart() 可以很好地重置 popBackStack() 上的 EditText 上的文本,但问题是当应用程序进入后台时,它们中的任何一个都将被触发,这不是预期的行为应用程序。我们也可以这样做,重置EditText上的文本-

      override fun onViewStateRestored(savedInstanceState: Bundle?) {
         super.onViewStateRestored(savedInstanceState)
         binding.coolEt.setText("xyz")
      }
      

      【讨论】:

        猜你喜欢
        • 2016-04-29
        • 2020-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多