我一直在思考这个问题,但没有找到解决方案。我仍然认为我只是忽略了一些非常简单的事情。
我的程序(主要)应该记录和播放音频,所以我得到一个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.
}
});
}
感谢任何帮助:)
马
答案 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(通过构造函数?)并在那里操作它。