如何从Custom AlertDialog调用MainActivity类?
我有内部MainActivity的方法命名PlaySong()
,并从MainActivity,我打电话这样如何从Custom AlertDialog调用MainActivity类?
SongListDialog songlistDialog = new SongListDialog(this, songsList);
songlistDialog.show();
我怎么能叫PlaySong()从的SongList这是SonglistDialog内的自定义AlertDialog类。目前,我有这样的ListView和我可以使用下面的代码跟踪任何歌曲点击:
@OnClick(R.id.card_view)
void onClick() {
Song song = songs.get(getAdapterPosition());
dialog.dismiss();
// here I want to call PlaySong() method which is inside MainActivity
}
任何想法如何做到这一点?
,防止泄漏的最佳方法是创建一个监听器接口
public interface SongListListener {
void playSong(Song song);
}
然后在你的SongListDialog构造
private final SongListListener mListener;
public SongListDialog(SongListListener listener, ...) {
mListener = listener;
}
@OnClick(R.id.card_view)
void onClick() {
Song song = songs.get(getAdapterPosition());
dialog.dismiss();
// notify listener
mListener.PlaySong(song);
}
最后实现SongListListener在MainActivity
public class MainActivity extends Activity implements SongListListener {
//...
@Override
void playSong(Song song){
//do whatever you want with the song here
}
//...
}
似乎你已经比我更快了,因为你已经结束了相同的解决方案;) – Eselfar
由于您通过MainActivity
在new SongListDialog(this, songsList)
您可以直接通过铸造例如playSong
。
public SongListDialog(Context ctx, ...) {
((MainActivity) ctx).playSong();
}
你想从你的活动适配器通过上下文和使用方面
((MainActivity)上下文).playSong();
您可以使用回调。
public interface OnSongSelectedListener{
void onSongSelected(Song song);
}
// Then in your Activity
SongListDialog songlistDialog = new SongListDialog(this, songsList, songSelectedListener);
songlistDialog.show();
理想情况下,活动本身应该实现接口。所以songSelectedListener
将是MainActivity.this
。
然后在onclick你做:
void onClick() {
Song song = songs.get(getAdapterPosition());
listener.onSongSelected(song); // Return the selected song
dialog.dismiss();
// here I want to call PlaySong() method which is inside MainActivity
}
如果你提供这个答案让OP意识到可能的上下文泄漏,那么实际上不可能在第一个时候传递整个上下文构造函数参数.. –
Idk OP正在处理上下文。如果它没有被对话框存储,则没有必要的泄漏。但是,你是对的。 – Eselfar
这样做有什么错误? – KeLiuyue
PlaySong();方法是在MainActivity类中,不能从定制的Dialog类访问,这是一个不同的类 – jquery404