android 将 OnClickListener OOP 放在哪里?
android where to put OnClickListener OOP-wise?
假设我有一个扩展 TextView 的 MyTextView class。 myTextView 对象应该是可点击的。
一方面,似乎 OnClickListener 应该在 MyTextView class 中,因为我将使用其中的一些,并且我不想为每个设置一个 OnClickListener。如果 OnClickListener 在 MyTextView class 中,它只会被写入一次。此外,所有 myTextView 对象在单击时执行相同的操作。
另一方面,这些对象需要更新 UI 和它们所在的 activity 中的一些变量。我无权访问这些变量和 UI MyTextView class 中的对象,并且通过构造函数发送对所有对象的引用感觉不对。
OOP 明智的做法是什么?
你可以这样做
class MyTextView extends TextView implements View.OnClickListener{
public MyTextView(Context context) {
super(context);
this.setOnClickListener(this);
}
public static interface MyTextListener{
public void updateUI();
}
@Override
public void onClick(View v) {
if(getContext() instanceof MyTextListener){
((MyTextListener)getContext()).updateUI();
}
}
}
继续实现activity中的接口
public class MainActivity extends Activity implements MyXextView.MyTextListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public void updateUI() {
//update here
}
}
假设我有一个扩展 TextView 的 MyTextView class。 myTextView 对象应该是可点击的。
一方面,似乎 OnClickListener 应该在 MyTextView class 中,因为我将使用其中的一些,并且我不想为每个设置一个 OnClickListener。如果 OnClickListener 在 MyTextView class 中,它只会被写入一次。此外,所有 myTextView 对象在单击时执行相同的操作。
另一方面,这些对象需要更新 UI 和它们所在的 activity 中的一些变量。我无权访问这些变量和 UI MyTextView class 中的对象,并且通过构造函数发送对所有对象的引用感觉不对。
OOP 明智的做法是什么?
你可以这样做
class MyTextView extends TextView implements View.OnClickListener{
public MyTextView(Context context) {
super(context);
this.setOnClickListener(this);
}
public static interface MyTextListener{
public void updateUI();
}
@Override
public void onClick(View v) {
if(getContext() instanceof MyTextListener){
((MyTextListener)getContext()).updateUI();
}
}
}
继续实现activity中的接口
public class MainActivity extends Activity implements MyXextView.MyTextListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public void updateUI() {
//update here
}
}