我有一个扩展View的自定义类,我在画布上绘制一些几何对象。我还有一个对话框类,我在其中显示一个简单的对话框。 (FinePartita.java)
我的MainActivity.java(我称之为我的视图)
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
PaschiPongView ppv = new PaschiPongView(getApplicationContext());
setContentView(ppv);
}
}
PaschiPongView.java
public class PaschiPongView extends View {
// a lot of code here
}
FinePartita.java(示例来自Google)
public class FinePartita extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Use the Builder class for convenient dialog construction
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setMessage(R.string.doUreallyWantToExit)
.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// FIRE ZE MISSILES!
}
})
.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// User cancelled the dialog
}
});
// Create the AlertDialog object and return it
return builder.create();
}
}
问题是,我需要在我的PaschiPongView类中显示对话框,但我不能这样做,因为它需要一个FragmentManager,因为我的类扩展了一个View,它没有它。
我不能这样称呼它:
FinePartita test = new FinePartita();
test.show(getFragmentManager(), "dialog"); // doesn't work
任何建议将不胜感激。
答案 0 :(得分:0)
首先,我会直接回答您的回答。这有点脏,但看起来似乎很安全:
Context
的{{1}}对象始终是View
持有它。
因此,将Activity
投射到Activity
的结果应该可以解决问题:
getContext()
其次,让我们谈谈你为什么要这样做: 通常,我从不让我的视图处理业务逻辑角色。为什么?因为我不希望将一般用例与特定视图联系起来。这样做,I.E。让您的视图影响应用程序的流程,意味着难以跟踪应用程序状态,并且更改流程更难。还有代码重复。并将您与未来可能不适用的UI设计决策联系起来。
我总是实现一个主控制器,视图报告其状态。我们称之为((Activity) getContext()).getFragmentManager();
。这是负责决定显示哪些对话框,如何处理结果等的对象。此外,这是存储FlowControl
引用的好地方。看看我在哪里?
答案 1 :(得分:0)
DialogFragment
是一个显示对话框的片段。如果您想要显示片段,则需要FragmentManager
,可以使用Activity
' getFragmentManager()
方法访问该片段。
DialogFragment
的show方式会显示Fragment
而非Dialog
。