我有一个自定义库视图,其中我重写了一些方法.我希望能够从这个类中调用我的主要活动中的函数.如何引用我的主类?
我以为我只是通过创建一个setter函数---> g.setBaseClass(this)将类引用推送到CustomGallery中;
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);
Run Code Online (Sandbox Code Playgroud)
问题是这是Context类型,someFunctionToCall()将导致不是此类错误的成员.在我的自定义课程中,我有:
public void setBaseClass(Context baseClass)
{
_baseClass = baseClass;
}
private void callSomeFuntionOnMyMainActivityClass()
{
_baseClass.someFunctionToCall();
}
Run Code Online (Sandbox Code Playgroud)
我想做的就是回调我的主类,名为ViewFlipperDemo.这在As3中很容易.有什么想法吗?希望我错过了一些非常简单的事情.
Cri*_*ian 15
这实际上不是一个好主意......但你可以这样做:
private void callSomeFuntionOnMyMainActivityClass()
{
((ViewFlipperDemo)_baseClass).someFunctionToCall();
}
Run Code Online (Sandbox Code Playgroud)
你应该做的是实现一个简单的观察者,它允许你通知活动发生的事情.这是主要的OO原则之一,您的自定义类不应该对您的活动类有任何了解.
观察者界面:
// TheObserver.java
public interface TheObserver{
void callback();
}
Run Code Online (Sandbox Code Playgroud)
您的自定义视图:
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
}
Run Code Online (Sandbox Code Playgroud)
这是使观察者受益的活动(请注意,现在您可以在不同的活动上使用自定义视图而不仅仅是一个,这是以这种方式实现它的关键原因之一):
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();
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
你会发现,这种设计模式(观察员)被广泛用于Java的和Android ...几乎任何类型的UI事件的使用观察员(实现的OnClickListener,OnKeyListener等等).顺便说一句,我没有测试代码,但它应该工作.