我正在阅读O'Reilly的"Programming Android"一书,我试图从第99页开始讨论"覆盖和回调"部分.他们将此作为优秀代码的示例:
public class MyModel {
public MyModel(TextView textBox) {
textBox.addTextChangedListener(
new TextWatcher() {
public void afterTextChanged(Editable s) {
handleTextChange(s);
}
// ...
}
void handleTextChange(Editable s) {
// do something with s, the changed text.
}
}
Run Code Online (Sandbox Code Playgroud)
后来由于缺乏可扩展性封装而将其称为反模式:
public class MyModel implements TextWatcher {
public MyModel(TextView textBox) {
textBox.addTextChangedListener(this);
}
public void afterTextChanged(Editable s) {
handleTextChange(s);
}
// ...
void handleTextChange(Editable s) {
// do something with s, the changed text.
}
}
Run Code Online (Sandbox Code Playgroud)
我没有看到两者之间的功能差异,除了第二个更具可读性.两者都采用TextView,并实现一个处理函数来覆盖.难道第二个不会像这样容易扩展吗?
public class AnotherModel …Run Code Online (Sandbox Code Playgroud) 我一直有一个非常恼人的问题,我怀疑是一个Android ADT错误(v21.0.0-519525).
假设我正在使用两个视图处理一个Activity - 顶部是TextView,底部是ImageView.我想将TextView从顶部移动到底部.如果我在GUI中单击或拖动它,或者我在XML中剪切/粘贴它,预览和XML代码的一切看起来都很好,但是当我去运行应用程序时,它们的ID似乎混淆了.将R.id.textView强制转换为TextView的代码会抛出错误,因为它现在认为R.id.textView是一个ImageView.
有没有其他人遇到这个?有办法解决吗?
我知道Jelly Bean 4.2增加了创建锁屏小部件的能力,但我也注意到某些应用程序(例如Spotify)已经为我的4.1.2手机添加了锁屏播放/暂停/停止/等控制.我不能为我的生活弄清楚他们是如何做到的.如何在我的应用程序中执行此类操作?
谢谢!