Android 3.2 - 在DialogFragment中自定义AlertDialog按钮

时间:2012-05-14 10:52:59

标签: android android-layout android-widget android-button android-dialogfragment

我创建了一个扩展DialogFragment的类,它在onCreateDialog方法中返回AlertDialog,如here
问题是,我想增加标准(正)按钮的高度,但我无法控制它来改变它的高度。
当我在DialogFragment

的onCreateDialog方法中执行以下操作时
mAlertDialog = new AlertDialog.Builder(getActivity())
            .setView(messageView)
            .setCustomTitle(titleView)
            .setPositiveButton(R.string.dialog_button,
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        ((ContextSwapUserInterface) getActivity()).instructionsAccepted();
                    }
                }
            )
            .create();

mAlertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setHeight(60);

我得到一个例外,它说“......无法实例化ComponentInfo ......” 我想这是因为Button在这个时间点没有正确实例化 所以我在创建DialogFragment之后尝试在我的主要活动中获取按钮并调用它的.show方法:

// Create and show a new InstructionsDialogFragment
DialogFragment instructionsDialogFragment = InstructionsDialogFragment.newInstance(mInstructions);
instructionsDialogFragment.show(getFragmentManager(), "Instructions Dialog");
((Button) instructionsDialogFragment.getDialog().findViewById(android.R.id.button1)).setHeight(60);

我也尝试了以下内容,而不是上面的最后一行:

((AlertDialog) instructionsDialogFragment.getDialog()).getButton(AlertDialog.BUTTON_POSITIVE).setHeight(60);

两个版本都会导致NullPointerException。有没有简单的方法可以在使用AlertDialog

时自定义DialogFragment的按钮

2 个答案:

答案 0 :(得分:4)

确定 - 尝试在片段的onActivityCreated方法中获取按钮。我为listfragment做了这个,但它也应该这样做 - 检查你有正确的ID等。

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        Button b = (Button)this.getView().findViewById(R.id.buttonID);

        b.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Toast.makeText(getActivity(), "Button Clicked",  Toast.LENGTH_SHORT).show();
            }
    });

答案 1 :(得分:2)

另一种方法是使用onShowListener修改按钮 我遇到了同样的问题,并且我按下按钮直到显示对话框.show()。我认为AlertDialog的UI元素不会在builder.create后实例化,而是仅在.show()之后实例化。

mAlertDialog.setOnShowListener(new OnShowListener() {
        @Override
        public void onShow(DialogInterface dialog) {
            ((AlertDialog)dialog).getButton(AlertDialog.BUTTON_POSITIVE).setHeight(60);
        }
    });