【问题标题】:Android view isDirty inside onClickAndroid view isDirty inside onClick
【发布时间】:2016-12-26 14:26:02
【问题描述】:

我想检查某些EditText 中的文本是否在用户单击某些Button 后发生更改。但是如果在onClick 内部调用,View#isDirty 似乎不会返回EditText 的正确状态。例如,我写了这样的东西:

public class MainActivity extends Activity {
    EditText editText;
    Button button;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        button = (Button) findViewById(R.id.f);
        editText = (EditText) findViewById(R.id.e);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                System.out.println((editText.isDirty() ? "is dirty" : "is clean"));
            }
        });
    }
}

在我对editText 进行任何更改之前,它会按预期输出is clean。但是即使我在editText中写了一些东西,也会打印相同的is clean
什么时候会调用isDirty?这是正确的方法吗?

更新:

我还想检查一些 SwitchSpinner 值是否发生了变化。 isDirty() 是正确的做法吗?

【问题讨论】:

  • 您好,您找到最佳解决方案了吗?我目前在我的应用中面临同样的问题。
  • @AbdulMateen 嗨。已经很长时间了,但我想我最终扩展了自己的表单输入类,该类将保持其状态(文本、已检查、项目...取决于输入类型)并在提交表单之前检查它是否已更改。这样我也可以对输入进行一些验证。
  • @AbdulMateen 关键是,如果我没记错的话,isDirty() 并没有像我想象的那样做。不管怎样,从那以后我就离开了 Android,也许在新的 SDK 版本中有一个内部机制。
  • SDK 还没有相应的机制。编写我自己的自定义解决方案:/

标签: android view


【解决方案1】:

当您单击按钮时,edittext 不再脏 - 文本已更新并且视图已重绘。也许如果你改变你的 onclick 处理程序,你会更好地理解发生了什么。

button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            editText = (EditText) findViewById(R.id.e);
            System.out.println((editText.isDirty() ? "is dirty" : "is clean"));
        }
    });

isDirty 只有在视图没有被重绘时才会返回 true。这发生得很快,基本上你没有(也不需要)对此进行任何控制。 我认为您需要使用其他一些方法来实现您想要的。

【讨论】:

  • 我明白了,这就是为什么当我在 Switch 的 OnCheckedChanged() 中调用 isDirty() 时它返回 true。这导致我犯了这个错误。
【解决方案2】:

我建议使用: https://stackoverflow.com/a/9459848/5684335

Okas 的评论很好地解释了原因。

【讨论】:

  • 但 isDirty 在更改 EditText 的文本或切换 Switch 后返回 true,如果它不在 onClick 内。
  • 我不知道这是否是建议,但如果您的 editText 是全局的,您可以编写另一个函数,该函数将由 onClick 方法调用。
  • 但我个人更喜欢onTextChanged()
  • 对不起,我没有在问题中提到,但实际上我有很多 View 需要检查,而且并不是所有的都是 TextView。所以我想我可以对它们中的任何一个使用isDirty(),而不管“脏”对它们意味着什么。或者,我可以为开关制作一个在onTextChanged()OnCheckedChanged() 中设置的标志的映射,但我认为这是一种更紧凑的方式。
猜你喜欢
  • 1970-01-01
  • 2012-03-20
  • 2015-10-24
  • 1970-01-01
  • 2018-08-10
  • 2016-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多