DialogFragment:设置按钮

时间:2014-07-22 17:42:27

标签: android android-dialogfragment

我正在尝试向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;
}

我所做的就是改变顶部的代码。 我错过了什么吗?

2 个答案:

答案 0 :(得分:0)

试试这个。在创建之前调用setView()。不要同时使用onCreateDialogonCreateView

@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

希望这会有所帮助