我想从AlertDialog的setPositiveButton()方法内部的片段调用一个方法,该方法用于返回DialogFragment的对话框,但不能这样做。
我在一个名为Test的类中有doSomething()方法,该类扩展了Fragment。在这个类中,我有一个扩展DialogFragment的内部类。在方法onCreateDialog中,问题就发生在这里。查看代码:
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() {}
}
对话片段和片段来自libandroid.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();
}
}
现在回到内部对话框类中的Test片段中:
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();
}
}
希望这次我已经回答了你的问题:)
我试图从碎片屏幕调用一个活动中的方法。 我有一个名为myMethod()的方法,它位于名为MyActivity的活动中;我有一个片段叫做Screen1Fragment。 我想给我的活动打电话。从Screen1Fragment内部创建myMethod(),但我不确定如何执行此操作。 以前,Screen1Fragment是一个活动,因此我扩展了MyActivity,以便可以直接调用myMethod()
我正在启动一个新项目,该项目使用支持库中的。我正在尝试弄清楚如何从片段中使用。我托管片段的活动扩展了,但我没有看到Fragments的类似支持类。 从我的片段中 使用它的google页面(http://android-developers.blogspot.in/2013/08/actionbarcompat-and-io-2013-app-source.html)表示v4片段不应更改。我是否需要
我在片段类中有方法。我想从主活动中调用该方法,但不想使用FragmentById(或)FragmentByTag。 我的碎片方法: 如何在不使用FragmentById(或)FragmentByTag的情况下从主活动调用上述方法?
那么DialogFragments有什么特别之处呢?为什么在显示对话框时没有暂停调用片段?又如何实现呢? 我在文档中没有发现任何关于这种行为的引用,所以引用是一个加号。
P.P.S@Philipp Jahoda,我实现了onCreateOptionsMenu(...)在片段的托管活动中。
如果从Fragment调用,我的DialogFragment会抛出ClassCastException,而如果从Activity调用,则会正常工作。我已经看了很少的其他问题与类似的问题,基本上是与进口有关的,但我没有能够解决在我的实现。下面是我对DialogFragment的实现。 下面是我使用上面的DialogFragment的片段: 这是错误日志: 我想知道有没有人能给出一个关于这个问题的提示