我正在尝试使用接口/回调在自定义View和DialogFragment之间创建通信。
自定义视图:
public MyDraw extends View implements ColorPickerListener
{
public MyDraw(Context context)
{
super(context);
// ...
MyDialogFragment.setColorPickerListener(this);
}
@Override
public void onColorChanged(int color)
{
// ...
}
}
DialogFragment
public MyDialogFragment extends DialogFragment
{
public interface ColorPickerListener
{
public void onColorChanged(int color);
}
ColorPickerListener colorPickerListener;
public static void setColorPickerListener(ColorPickerListener listener)
{
colorPickerListener = listener;
}
// ....
private void colorSelected(int color)
{
colorPickerListener.onColorChanged(color);
}
}
这是有效的,但我不确定这是否正常。我害怕内存泄漏,因为我正在引用从View到对话框片段的静态方法。
是否有其他替代解决方案,例如将活动,实例或转换为某些内容?
答案 0 :(得分:1)
您无需调用静态setColorPickerListener
方法。您可以使用DialogFragment
方法找到findFragmentByTag
个实例,然后只需调用setColorPickerListener
(非静态方法)。
public void showPickerDialog() {
DialogFragment newFragment = new PickerFragment();
newFragment.show(this.getSupportFragmentManager(), "dialogfrag1");
getSupportFragmentManager().executePendingTransactions();
// getting the fragment
PickerFragment df1 = (PickerFragment) getSupportFragmentManager().findFragmentByTag("dialogfrag1");
if (df1 != null) {
df1.registerListener(this);
}
}