如何从Android中的自定义图库视图调用主Activity类中的函数?

时间:2010-12-16 01:23:54

标签: android

我有一个自定义图库视图,其中我重写了一些方法。我希望能够从这个类中调用我的主要活动中的函数。如何引用我的主要课程?

我以为我只是通过创建一个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中很容易。有什么想法吗?希望我错过了一些非常简单的事情。

1 个答案:

答案 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事件都是使用观察者(OnClickListenerOnKeyListener等)实现的。顺便说一句,我没有测试代码,但它应该工作。