Java 从内部DialogFragment内的主片段调用方法时出错
我想从AlertDialog的方法setPositiveButton()内的片段调用一个方法,该方法用于返回DialogFragment的对话框,但无法执行此操作 我在一个名为Test的类中有doSomething()方法,该类扩展了Fragment。在这个类中,我有一个扩展DialogFragment的内部类。在方法onCreateDialog中,是问题发生的地方。看看代码:Java 从内部DialogFragment内的主片段调用方法时出错,java,android,android-fragments,Java,Android,Android Fragments,我想从AlertDialog的方法setPositiveButton()内的片段调用一个方法,该方法用于返回DialogFragment的对话框,但无法执行此操作 我在一个名为Test的类中有doSomething()方法,该类扩展了Fragment。在这个类中,我有一个扩展DialogFragment的内部类。在方法onCreateDialog中,是问题发生的地方。看看代码: public class Test extends Fragment { @Override public View
public class Test extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View view = inflater.inflate(R.layout.activity_main, null);
return view;
}
public static class SelectDeviceDialogFragment extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(getActivity())
.setPositiveButton(R.string.ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
((Test) getTargetFragment()).doSomething();
}
}).create();
}
}
private void doSomething() {}
}
DialogFragment和Fragment来自lib android.support.v4
发生此错误是因为无法执行要测试的强制转换。在这种情况下,我如何调用doSomething方法
谢谢。在修改我的答案时,你可以走两条路。第一个是将静态类更改为最终声明,如下所示:
public final DialogFragment selectDeviceDialogFragment = new DialogFragment(){
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(getActivity())
.setPositiveButton(R.string.ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
doSomething();
}
}).create();
}
};
如果这不合适,并且确实需要静态声明,那么应该使用接口与之通信。因为您使用的是静态类,所以假设您是从另一个片段调用此DialogFragment。如果是这样,我会走这条路:
public interface DoSomething{
public void doSomething();
}
现在,在您的活动中,您需要实现DoSomething接口:
private class MyActivity extends Activity implements DoSomething{
/** other methods **/
@Override
public void doSomething() {
FragmentManager fragmentManager = getFragmentManager();
Test frag = (Test)fragmentManager.findFragmentById(/*the fragment id*/);
frag.doSomething();
}
}
现在回到内部对话类中的测试片段:
public static class SelectDeviceDialogFragment extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(getActivity())
.setPositiveButton(R.string.ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
MyActivity activity = (MyActivity)getActivity();
activity.doSomething();
}
}).create();
}
}
希望这次我已经回答了你的问题:)那是办不到的。为了更好的理解,我修改了这个问题。希望编辑能起作用!请让我知道,如果这些解决方案中的任何一个对您有效,不幸的是,它不起作用。FragmentActivity是这样的,因此我没有任何标识我的片段的Id。