我正在使用一个扩展View来创建画布的类。它的名字是MyBringBack类。在我的MainActivity类中,我以编程方式定义了一个布局。 MyBringBack类中有一个公共静态变量,我在MyBringBack类的某些部分更改了它的值。 有可能知道这个变量何时发生变化?我希望通过使用此更改来改变MainActivitiy类中的内容。
在MainActivity Class中
setContentView(R.layout.activity_main);
li = (LinearLayout) findViewById(R.id.canvasLayout);
//This is where i have to bring the canvas
MyBringBack pcc = new MyBringBack (this);
li.addView(pcc);
在MyBringBack类中
public static int score =0 ;
答案 0 :(得分:1)
您可以(实际上应该)使用观察者模式执行此操作。
你不需要你的价值是一个静态的,它实际上打破了封装原则。
我认为某些代码可能会让你更好,所以我会为你提供代码示例,但首先是一些解释:
以下是一个说明其工作原理的示例:
public class MyBringBack extends View {
// ----------------------------------
// INTERFACES
// ----------------------------------
public interface BringBackListener {
public abstract void onObservableValueChanged(int value);
}
// ----------------------------------
// CONSTANTS
// ----------------------------------
private static final int VALUE_UPDATE_TIMEOUT = 1000;
// ----------------------------------
// ATTRIBUTES
// ----------------------------------
private int mObservableValue = 0;
private static Handler mHandler;
private static UpdateObservableValueRunnable mUpdateObservableValueRunnable;
private BringBackListener mListener;
// ----------------------------------
// CONSTRUCTORS
// ----------------------------------
public MyBringBack(Context context) {
super(context);
initializeView();
}
public MyBringBack(Context context, AttributeSet attrs) {
super(context, attrs);
initializeView();
}
public MyBringBack(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initializeView();
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public MyBringBack(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
initializeView();
}
// ----------------------------------
// PUBLIC METHODS
// ----------------------------------
public void setBringBackListener(BringBackListener listener) {
mListener = listener;
}
// ----------------------------------
// PRIVATE METHODS
// ----------------------------------
private void initializeView() {
mHandler = new Handler();
mUpdateObservableValueRunnable = new UpdateObservableValueRunnable();
mHandler.postDelayed(mUpdateObservableValueRunnable, VALUE_UPDATE_TIMEOUT);
}
// ----------------------------------
// NESTED CLASSES
// ----------------------------------
private class UpdateObservableValueRunnable implements Runnable {
public void run() {
mObservableValue++;
if (mListener != null) {
mListener.onObservableValueChanged(mObservableValue);
}
mHandler.postDelayed(mUpdateObservableValueRunnable, VALUE_UPDATE_TIMEOUT);
}
}; // UpdateObservableValue
}
在这个自定义视图中,我设置了每秒运行一次的runnable。它做了两件事:
现在,这是一个示例活动,将观察此视图的更改:
public class MainActivity extends ActionBarActivity implements BringBackListener {
// ----------------------------------
// ATTRIBUTES
// ----------------------------------
private TextView mResultTextView;
// ----------------------------------
// LYFECYCLE
// ----------------------------------
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mResultTextView = (TextView) findViewById(R.id.resultTextView);
LinearLayout li = (LinearLayout) findViewById(R.id.canvasLayout);
MyBringBack pcc = new MyBringBack(this);
li.addView(pcc);
// Do not forget to set the listener (here it is the MainActivity
// since it implements BringBackListener)
pcc.setBringBackListener(this);
}
// ----------------------------------
// IMPLEMENTED METHODS
// ----------------------------------
@Override
public void onObservableValueChanged(int value) {
mResultTextView.setText(value + "");
}
}
此活动实现了BringBackListener,因此我们必须实现onObservableValueChanged(int value)。通过这种方法,活动能够观察到变化。
请注意,活动必须通过MyBringBack中定义的侦听器setter注册自己:setBringBackListener();
答案 1 :(得分:0)
好吧,你可以创建一个方法,每次你对变量进行更改时都会调用它。 你知道大多数听众背后的模式是什么吗?观察者模式。因此,如果你想在你的代码中为该实现一个观察者模式一个自己的监听器!