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

Rib*_*ibs 6 android

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

我以为我只是通过创建一个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等等).顺便说一句,我没有测试代码,但它应该工作.