2017-10-12 51 views
-1

我有内部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 
} 

任何想法如何做到这一点?

+0

这样做有什么错误? – KeLiuyue

+0

PlaySong();方法是在MainActivity类中,不能从定制的Dialog类访问,这是一个不同的类 – jquery404

回答

2

,防止泄漏的最佳方法是创建一个监听器接口

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 
    } 
//... 
} 
+1

似乎你已经比我更快了,因为你已经结束了相同的解决方案;) – Eselfar

0

由于您通过MainActivitynew SongListDialog(this, songsList)您可以直接通过铸造例如playSong

public SongListDialog(Context ctx, ...) { 
    ((MainActivity) ctx).playSong(); 
} 
0

你想从你的活动适配器通过上下文和使用方面

((MainActivity)上下文).playSong();

2

您可以使用回调。

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 
} 
+1

如果你提供这个答案让OP意识到可能的上下文泄漏,那么实际上不可能在第一个时候传递整个上下文构造函数参数.. –

+0

Idk OP正在处理上下文。如果它没有被对话框存储,则没有必要的泄漏。但是,你是对的。 – Eselfar

相关问题