Android - Java - 从另一个实例类访问Main-Activity中的私有变量

时间:2011-04-25 20:07:14

标签: java android

我一直在思考这个问题,但没有找到解决方案。我仍然认为我只是忽略了一些非常简单的事情。

我的程序(主要)应该记录和播放音频,所以我得到一个Main-Activity,其中包含所有具有用户交互性的功能,我有一个名为'AudioHandler'的类来管理所有音频内容的背景。 Main-Activity使用AudioHandler的实例。

在AudioHandler-class中,我有一个OnCompletionListener,注意录制的音频文件的播放何时结束。

问题是:当播放完成 - 并且OnCompletionListener被调用时,我想在Main-Activity中更改ImageView(将暂停按钮变为播放按钮)。

如何从AudioHandler-Instance访问Main-Activity中的ImageView?

...没有公开ImageView-Variable。

从主要活动中的AudioHandler调用播放的方法:

  public State playRecording() {
    //change play-button to stop-button
    iPlay.setImageResource(R.drawable.stop_button_active);

    //start or resume playback of the recorded Audio
    ah.play();

    //Return that the program is in playing-mode
    return State.PLAYING;
}

AudioHandler中的播放功能

  public void play() {
        try {

            mPlayer.start();
        } catch (IllegalArgumentException e) {
            Log.d("MEDIA_PLAYER", e.getMessage());
            e.printStackTrace();
        } catch (IllegalStateException e) {
            Log.d("MEDIA_PLAYER", e.getMessage());
            e.printStackTrace();
        }




        //add listener to notice when the end of the audio record has been reached 
        mPlayer.setOnCompletionListener(new OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {

                //should somehow change the ImageView 'iPlay' in the Main-Activity when reaching this point.



            }
        });     
    }

感谢任何帮助:)

3 个答案:

答案 0 :(得分:3)

如果您需要访问变量,该变量应该是可以访问包的,也可以是公共的。或者,更好的是,你应该有一个封装方法。类似的东西:

// On the main class:
public ImageView getIPlay(){
    return iPlay;
}
private static MainActivity instance;
public MainActivity getInstance(){
    return instance;
}

/** Either on the constructor or the 'OnCreate' method, you should add: */
    instance = this;

现在,您可以使用以下命令从任何活动或类访问ImageView:

   MainActivity.getInstance().getIPlay();

就这么简单,真的。你可以通过许多其他解决方案,从使用AOP反射或任何类型的东西。但这只会使问题变得更加复杂。尝试创建setter方法。

答案 1 :(得分:1)

您的问题是关于对象封装。

当您将实例变量定义为私有时,您只是说该对象和该类的成员可以访问该变量。这是一件好事,因为它可以防止您意外更改您不想要的数据。这也是我们有吸气剂和制定者的原因。

所以在你的课堂上你有一些我想象的东西

    public class Main {
... some code here
    private ImageView myView;
... more code here

您需要做的是将以下方法添加到您的Main类

public ImageView getView() {
       return myView;
}

public void setView(ImageView a) {
       myView = a;
}

所以现在当你想从另一个类访问ImageView时,你只需调用类似Main.getView()的东西,你就可以拥有它。

现在,如果这不能回答你的问题,那是因为你没有过于周到地设计你的应用程序(看起来似乎如此)但幸运的是,我不会是那种告诉你根除你所做的一切的响应者重新开始。

听起来您正在使用Android应用,而您的问题是在活动之间进行沟通。

这就是为什么Android有一个名为Intents的东西。您可以将Intent从一个活动发送到另一个活动以携带数据。因此,在这种情况下,您将从一个活动发送一个Intent到主类,它将告诉主类更改imageview中的图片。我不会撒谎,我很擅长使用意图,但网上有许多精彩的教程会告诉你如何做到这一点。

另一种选择是创建具有播放/暂停按钮的布局的RemoteView并从其他活动访问它,RemoteView具有内置函数来更改远程imageview的位图(再次,请参阅Android Developer RemoteView的文档以获取更多信息)

对不起,我无法给你一些实际的代码,我对这些主题的能力不够自信,但我完全相信我刚才列出的三种方法中的一种会回答你的问题。

答案 2 :(得分:0)

您可以在主Activity中创建一个公共包装器方法,在暂停和播放之间切换ImageView。

或者,您可以将ImageView传递给AudioHandler(通过构造函数?)并在那里操作它。