我正在尝试向DialogFragment
添加按钮。我的第一种方法是声明片段布局上的按钮,然后在OnClickListener
方法上设置OnCreateView
s。它确实有效,但在我阅读更多有关DialogFragment
的内容时,我意识到您可以在OnCreateDialog
方法上添加按钮,所以我尝试了这样:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(getActivity())
.setCancelable(true)
.setPositiveButton(R.string.ok, null)
.setNeutralButton(R.string.print, null)
.setNegativeButton(R.string.cancel, null)
.create();
}
但我一直得到这个例外:
07-22 12:40:41.883 30960-30960/com.sellcom.tracker E/AndroidRuntime﹕ FATAL EXCEPTION: main
android.util.AndroidRuntimeException: requestFeature() must be called before adding content
at com.android.internal.policy.impl.PhoneWindow.requestFeature(PhoneWindow.java:217)
at com.android.internal.app.AlertController.installContent(AlertController.java:237)
at android.app.AlertDialog.onCreate(AlertDialog.java:336)
at android.app.Dialog.dispatchOnCreate(Dialog.java:351)
at android.app.Dialog.show(Dialog.java:256)
at android.support.v4.app.DialogFragment.onStart(DialogFragment.java:385)
at android.support.v4.app.Fragment.performStart(Fragment.java:1524)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:968)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1115)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1478)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:446)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:153)
at android.app.ActivityThread.main(ActivityThread.java:4987)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:821)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
at dalvik.system.NativeStart.main(Native Method)
我已经阅读了一些教程,但没有人对此有任何说明。奇怪的部分是我在代码的任何一点都没有调用requestFeature()
。
这是我之前的代码:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = super.onCreateDialog(savedInstanceState);
dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
return dialog;
}
这就是我给自定义视图充气的地方:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_receipt, container, false);
if (view != null) {
//Items of first view
flipper = (ViewFlipper) view.findViewById(R.id.view_flipper);
receiptNumber = (TextView) view.findViewById(R.id.receipt_number);
receiptDate = (TextView) view.findViewById(R.id.receipt_date);
issuedBy = (TextView) view.findViewById(R.id.issued_by);
receivedBy = (TextView) view.findViewById(R.id.received_by);
receiptSubtotal = (TextView) view.findViewById(R.id.receipt_subtotal);
receiptTaxes = (TextView) view.findViewById(R.id.receipt_tax);
receiptTotal = (TextView) view.findViewById(R.id.receipt_total);
productsList = (ListView) view.findViewById(R.id.products_list);
receiverSignature = (ImageView) view.findViewById(R.id.receiver_signature);
issuingSignature = (ImageView) view.findViewById(R.id.issuing_signature);
receiverName = (EditText) view.findViewById(R.id.receiver_name);
issuingName = (EditText) view.findViewById(R.id.issuing_name);
okButton = (Button) view.findViewById(R.id.ok_button);
cancelButton = (Button) view.findViewById(R.id.cancel_button);
printButton = (Button) view.findViewById(R.id.print_button);
//Items of second view
firstName = (EditText) view.findViewById(R.id.people_first_name);
lastName = (EditText) view.findViewById(R.id.people_last_name);
email = (EditText) view.findViewById(R.id.people_email);
phone = (EditText) view.findViewById(R.id.people_phone);
address1 = (EditText) view.findViewById(R.id.people_address_1);
address2 = (EditText) view.findViewById(R.id.people_address_2);
city = (EditText) view.findViewById(R.id.people_city);
state = (EditText) view.findViewById(R.id.people_state);
country = (EditText) view.findViewById(R.id.people_country);
zipCode = (EditText) view.findViewById(R.id.people_zip_code);
okButton.setOnClickListener(this);
cancelButton.setOnClickListener(this);
printButton.setOnClickListener(this);
receiverSignature.setOnClickListener(this);
issuingSignature.setOnClickListener(this);
switch (receiptType) {
case ReceiptAdapter.RECEIVING:
receiptItems = createReceivingList();
break;
case ReceiptAdapter.SALE:
receiptItems = createSalesList();
break;
case ReceiptAdapter.ORDER:
receiptItems = createOrderList();
receiptNumber.setVisibility(View.GONE);
receiptDate.setVisibility(View.GONE);
issuedBy.setVisibility(View.GONE);
receivedBy.setVisibility(View.GONE);
view.findViewById(R.id.issuing_layout).setVisibility(View.GONE);
break;
}
ReceiptAdapter receiptAdapter = new ReceiptAdapter(getActivity(), receiptType, receiptItems);
productsList.setAdapter(receiptAdapter);
}
return view;
}
我所做的就是改变顶部的代码。 我错过了什么吗?
答案 0 :(得分:0)
试试这个。在创建之前调用setView()
。不要同时使用onCreateDialog
和onCreateView
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
View view = getActivity().getLayoutInflater().inflate(R.layout.dialog_layout, null);
builder.setView(view);
if (view != null) {
//Items of first view
flipper = (ViewFlipper) view.findViewById(R.id.view_flipper);
receiptNumber = (TextView) view.findViewById(R.id.receipt_number);
receiptDate = (TextView) view.findViewById(R.id.receipt_date);
issuedBy = (TextView) view.findViewById(R.id.issued_by);
receivedBy = (TextView) view.findViewById(R.id.received_by);
receiptSubtotal = (TextView) view.findViewById(R.id.receipt_subtotal);
receiptTaxes = (TextView) view.findViewById(R.id.receipt_tax);
receiptTotal = (TextView) view.findViewById(R.id.receipt_total);
productsList = (ListView) view.findViewById(R.id.products_list);
receiverSignature = (ImageView) view.findViewById(R.id.receiver_signature);
issuingSignature = (ImageView) view.findViewById(R.id.issuing_signature);
receiverName = (EditText) view.findViewById(R.id.receiver_name);
issuingName = (EditText) view.findViewById(R.id.issuing_name);
okButton = (Button) view.findViewById(R.id.ok_button);
cancelButton = (Button) view.findViewById(R.id.cancel_button);
printButton = (Button) view.findViewById(R.id.print_button);
//Items of second view
firstName = (EditText) view.findViewById(R.id.people_first_name);
lastName = (EditText) view.findViewById(R.id.people_last_name);
email = (EditText) view.findViewById(R.id.people_email);
phone = (EditText) view.findViewById(R.id.people_phone);
address1 = (EditText) view.findViewById(R.id.people_address_1);
address2 = (EditText) view.findViewById(R.id.people_address_2);
city = (EditText) view.findViewById(R.id.people_city);
state = (EditText) view.findViewById(R.id.people_state);
country = (EditText) view.findViewById(R.id.people_country);
zipCode = (EditText) view.findViewById(R.id.people_zip_code);
okButton.setOnClickListener(this);
cancelButton.setOnClickListener(this);
printButton.setOnClickListener(this);
receiverSignature.setOnClickListener(this);
issuingSignature.setOnClickListener(this);
switch (receiptType) {
case ReceiptAdapter.RECEIVING:
receiptItems = createReceivingList();
break;
case ReceiptAdapter.SALE:
receiptItems = createSalesList();
break;
case ReceiptAdapter.ORDER:
receiptItems = createOrderList();
receiptNumber.setVisibility(View.GONE);
receiptDate.setVisibility(View.GONE);
issuedBy.setVisibility(View.GONE);
receivedBy.setVisibility(View.GONE);
view.findViewById(R.id.issuing_layout).setVisibility(View.GONE);
break;
}
ReceiptAdapter receiptAdapter = new ReceiptAdapter(getActivity(), receiptType, receiptItems);
productsList.setAdapter(receiptAdapter);
}
return builder.create();
}
答案 1 :(得分:0)
requestWindowFeature(Window.FEATURE_NO_TITLE);
请参阅此帖子:android.util.AndroidRuntimeException: requestFeature() must be called before adding content
希望这会有所帮助