在不使用AlertDialog.Builder的情况下创建AlertDialog

时间:2013-05-31 17:05:04

标签: android

我正在尝试创建一个自定义AlertDialog,它在使用Theme.Holo.Light.Dialog主题时不使用系统样式默认值。我希望它使用该主题,但我希望与ListActivity使用相同主题的样式相同。不同的类对于同一主题具有不同的样式,因此看起来我需要创建DialogFragment的子类。另一个限制是我希望这个对话框是通用的。也就是说,我希望能够有条件地添加按钮,消息,标题,图标和项目。因此,似乎我不能只是从xml文件中膨胀DialogFragment(或者如果我可以创建我想要的所有可能元素,然后隐藏那些我不想要的元素,我可以是否可以以编程方式构建DialogFragment而不将其从单个xml文件中膨胀?

修改

看起来这可能会有所帮助:Add controls to custom dialog programatically

我正在使用这个答案开展工作:Dynamically add table row in table and display it in dialog box in android

为什么使用此代码时按钮不显示?

我在布局中添加的xml元素确实出现了。

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = super.onCreateDialog(savedInstanceState);
    return dialog;
}

@Override
public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    View contentView = inflater.inflate(R.layout.post_dialog, container);
    RelativeLayout layout = (RelativeLayout) contentView.findViewById(R.id.post_dialog_layout);

    Button testButton = new Button(getActivity());
    testButton.setText("success");
    testButton.setLayoutParams(new RelativeLayout.LayoutParams(
            ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT));
    layout.addView(testButton);
    return contentView;
}

2 个答案:

答案 0 :(得分:-1)

您需要的一切都是herehere。基本上,为了构建对话框的内容,您应该覆盖onCreateView(...),但如果您想要更多地控制Dialog本身,您也可以覆盖onCreateDialog(...)

构建器模式可以帮助和平滑事物,但如果您更喜欢构建自己的东西,您可以完全以编程方式构建Dialog实例及其内容视图,甚至不会夸大XML并简单地实例化布局元素在运行时。

答案 1 :(得分:-2)

您可以将参数Bundle设置为创建DialogFragment,然后使用它们来配置Dialog。其中一些可能是可选的,您可以使用它来检测哪个选项对话框应包含(标题,附加按钮,图标)。

import android.app.AlertDialog;
import android.app.Dialog;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;

import ru.daoffice.R;

public class AlertDialogFragment extends DialogFragment {

    private static final String ARG_TITLE = "ArgTitle";

    private static final String ARG_MESSAGE = "ArgMessage";

    public static DialogFragment newInstance(String title, String message) {
        Bundle argumnets = new Bundle();
        argumnets.putString(ARG_TITLE, title);
        argumnets.putString(ARG_MESSAGE, message);

        DialogFragment dialogFragment = new AlertDialogFragment();
        dialogFragment.setArguments(argumnets);
        return dialogFragment;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return new AlertDialog.Builder(getActivity())
            .setIcon(R.drawable.alert_dialog_icon)
            .setTitle(getArguments().getString(ARG_TITLE))
            .setMessage(getArguments().getString(ARG_MESSAGE))
            .setPositiveButton(android.R.string.ok, null)
            .create();
    }
}