我有一个自定义图库视图,其中我重写了一些方法。我希望能够从这个类中调用我的主要活动中的函数。如何引用我的主要课程?
我以为我只是通过创建一个setter函数将类引用推送到CustomGallery ---> g.setBaseClass(本);
CustomGallery g = (CustomGallery) findViewById(R.id.playSelectionGallery);
g.setSpacing(10);
g.setCallbackDuringFling(false);
g.setAdapter(new ImageAdapter(this));
g.setSelection(1);
registerForContextMenu(g);
g.setBaseClass(this);
问题是此的类型为上下文, someFunctionToCall()会导致此类错误的成员不是。在我的自定义课程中,我有:
public void setBaseClass(Context baseClass)
{
_baseClass = baseClass;
}
private void callSomeFuntionOnMyMainActivityClass()
{
_baseClass.someFunctionToCall();
}
我想做的就是回调我的主类,名为ViewFlipperDemo。这在As3中很容易。有什么想法吗?希望我错过了一些非常简单的事情。
答案 0 :(得分:15)
这实际上不是一个好主意......但你可以这样做:
private void callSomeFuntionOnMyMainActivityClass()
{
((ViewFlipperDemo)_baseClass).someFunctionToCall();
}
你应该做的是实现一个简单的观察者,它允许你通知活动发生的事情。这是主要的OO原则之一,您的自定义类不应该对您的活动类有任何了解。
观察者界面:
// TheObserver.java
public interface TheObserver{
void callback();
}
您的自定义视图:
public class CustomGallery{
private TheObserver mObserver;
// the rest of your class
// this is to set the observer
public void setObserver(TheObserver observer){
mObserver = observer;
}
// here be the magic
private void callSomeFuntionOnMyMainActivityClass(){
if( mObserver != null ){
mObserver.callback();
}
}
// actually, callSomeFuntionOnMyMainActivityClass
// is not a good name... but it will work for the example
}
这是让观察者受益的活动(请注意,现在您可以在不同的活动上使用自定义视图而不仅仅是一个,这是以这种方式实现它的关键原因之一):
public class YourActivity extends Activity{
// your normal stuff bla blah
public void someMethod(){
CustomGallery g=(CustomGallery)findViewById(R.id.playSelectionGallery);
g.setObserver(new TheObserver(){
public void callback(){
// here you call something inside your activity, for instance
methodOnYourActivity();
}
});
}
}
您会注意到这种设计模式(观察者)在Java和Android中被广泛使用...几乎任何类型的UI事件都是使用观察者(OnClickListener
,OnKeyListener
等)实现的。顺便说一句,我没有测试代码,但它应该工作。