我正在嘗試使用AlertDialog
中的自定義視圖創建DialogFragment
。這個視圖必須從xml中誇大。在我的DialogFragment
I類有:在DialogFragment中爲AlertDialog充氣自定義視圖問題
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(getActivity())
.setTitle("Title")
.setView(getActivity().getLayoutInflater().inflate(R.layout.dialog, null))
.setPositiveButton(android.R.string.ok, this)
.setNegativeButton(android.R.string.cancel, null)
.create();
}
我曾嘗試.setView()
其他充氣的方法,如:
.setView(getActivity().getLayoutInflater().inflate(R.layout.dialog, (ViewGroup) getView(), false))
和
.setView(getActivity().getLayoutInflater().inflate(R.layout.dialog, (ViewGroup) getTargetFragment().getView(), false))
在作爲片段設定目標片段後顯示這個對話框。
所有這些企圖誇大以下異常我的自定義視圖結果:
E/AndroidRuntime(32352): android.util.AndroidRuntimeException: requestFeature() must be called before adding content
E/AndroidRuntime(32352): at com.android.internal.policy.impl.PhoneWindow.requestFeature(PhoneWindow.java:214)
E/AndroidRuntime(32352): at com.android.internal.app.AlertController.installContent(AlertController.java:248)
E/AndroidRuntime(32352): at android.app.AlertDialog.onCreate(AlertDialog.java:314)
E/AndroidRuntime(32352): at android.app.Dialog.dispatchOnCreate(Dialog.java:335)
E/AndroidRuntime(32352): at android.app.Dialog.show(Dialog.java:248)
E/AndroidRuntime(32352): at android.support.v4.app.DialogFragment.onStart(DialogFragment.java:339)
E/AndroidRuntime(32352): at android.support.v4.app.Fragment.performStart(Fragment.java:1288)
E/AndroidRuntime(32352): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:873)
E/AndroidRuntime(32352): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1041)
E/AndroidRuntime(32352): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:625)
E/AndroidRuntime(32352): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1360)
E/AndroidRuntime(32352): at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:411)
E/AndroidRuntime(32352): at android.os.Handler.handleCallback(Handler.java:587)
E/AndroidRuntime(32352): at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime(32352): at android.os.Looper.loop(Looper.java:132)
E/AndroidRuntime(32352): at android.app.ActivityThread.main(ActivityThread.java:4028)
E/AndroidRuntime(32352): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(32352): at java.lang.reflect.Method.invoke(Method.java:491)
E/AndroidRuntime(32352): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
E/AndroidRuntime(32352): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
E/AndroidRuntime(32352): at dalvik.system.NativeStart.main(Native Method)
而如果我嘗試使用DialogFragment
的getLayoutInflator(Bundle)
這樣的:
.setView(getLayoutInflater(savedInstanceState).inflate(R.layout.dialog, null))
我得到一個StackOverflowError
。
有誰知道如何在DialogFragment
中膨脹AlertDialog
的自定義視圖嗎?
這對我有用,但我想明白爲什麼。爲什麼dialogFragment的getLayoutInflater會返回一個與Activity不同的layoutinflater? – stork
每個LayoutInflater綁定到一個上下文(在Activity和片段之間有所不同),並且片斷使事情變得複雜。此外,還有一些不能遞歸工作的東西(例如對話框中的對話框)。我猜想問題在於實例化順序和遞歸之間的某處,但它可能更容易滾動,而不是進一步挖掘... – ProjectJourneyman
這導致我真正的問題是你必須調用'setView()'之前(比如'setTitle()',這是我做錯了)。謝謝。 – ashughes