Android 自定义对话框片段中的View.OnClickListener

Android 自定义对话框片段中的View.OnClickListener,android,android-view,onclicklistener,android-dialogfragment,Android,Android View,Onclicklistener,Android Dialogfragment,在教程之后,我正在尝试实现一个自定义的对话框片段。我的问题是无法处理自定义视图的button.setOnClickListener事件。最奇怪的是,我在获取按钮的.getText()时没有问题,只是找不到处理单击事件的方法。下面是我的代码: SettingsDialogFragment.java public class SettingsDialogFragment extends DialogFragment { @Override public Dialog onCreateDialog(

在教程之后,我正在尝试实现一个自定义的
对话框片段
。我的问题是无法处理自定义视图的button.setOnClickListener事件。最奇怪的是,我在获取按钮的
.getText()
时没有问题,只是找不到处理单击事件的方法。下面是我的代码:

SettingsDialogFragment.java

 public class SettingsDialogFragment extends DialogFragment
{
@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    // Get the layout inflater
    LayoutInflater inflater = getActivity().getLayoutInflater();
    final View view = inflater.inflate(R.layout.dialog_settings, null);

    final Button colorButton =(Button) view.findViewById(R.id.colorButton_dialogSettings);
    String s = colorButton.getText().toString();
    System.out.println("its working "+s);

    //NOT working
    colorButton.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            System.out.println("OnClick");
        }
    });

    // Inflate and set the layout for the dialog
    // Pass null as the parent view because its going in the dialog layout
    builder.setView(inflater.inflate(R.layout.dialog_settings, null))
            // Add action buttons
            .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int id)
                {

                }
            })
            .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    SettingsDialogFragment.this.getDialog().cancel();
                }
            });
    return builder.create();
}
` 我的自定义视图代码(dialog_settings.xml)



新答案

将您的
onCreateDialog
更改为:

import android.view.View.OnClickListener; 

public class SettingsDialogFragment extends DialogFragment implements onClickListener
{
@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    // Get the layout inflater
    LayoutInflater inflater = getActivity().getLayoutInflater();
    final View view = inflater.inflate(R.layout.dialog_settings, null);

    final Button colorButton =(Button) view.findViewById(R.id.colorButton_dialogSettings);
    String s = colorButton.getText().toString();
    System.out.println("its working "+s);

    colorButton.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            switch (v.getId()) {
                case R.id.colorButton_dialogSettings
                    System.out.println("OnClick");
                    break;
                default:
                    break;
        }
    });

    // Inflate and set the layout for the dialog
    // Pass null as the parent view because its going in the dialog layout
    builder.setView(inflater.inflate(R.layout.dialog_settings, null))
            // Add action buttons
            .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int id)
                {

                }
            })
            .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    SettingsDialogFragment.this.getDialog().cancel();
                }
            });
    return builder.create();
}
在您的活动中:

private Button colorButton=(按钮)findviewbyd(R.id.colorButton\u对话框设置)

**旧答案要求你自己写*

尝试在onCreateDialog中删除按钮代码并添加以下内容:

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_dialog, container, false);
        Button colorButton =(Button) v.findViewById(R.id.colorButton_dialogSettings);
            public void onClick(View v) {
            // When button is clicked, call up to owning activity.
                ((FragmentDialog)getActivity()).showDialog();
                System.out.println("OnClick");
            }
        });

        return v;

我只是给你看重要的部分。。我希望您能在代码中找到它们各自的行

final View view = inflater.inflate(R.layout.dialog_settings, null);
// inflating your view..for drawback, this line is [A]
您的
colorButton
引用了
view.findViewById(R.id.colorButton\u dialogSettings)
,它来自视图组
view
。您为它引用了onclick侦听器

builder.setView(inflater.inflate(R.layout.dialog_settings, null))
这里的代码设置对话框的内容视图。它会在布局中充气并完成它的工作。。因此,最终您的
builder
不是将其内容视图引用到
view
,而是引用一个新的
R.layout.dialog\u settings
layout

所以要解决这个问题就这么做吧

builder.setView(view) // hope you know the view parameter
视图是您在第[A]行实例化的内容


希望我讲得有道理,对你来说足够清楚。让我知道它是否有帮助。

尝试更改为
colorButton.setOnClickListener(新的DialogInterface.OnClickListener()
我不能使用
DialogInterface.OnClickListener
因为
DialogFragment
没有实现它,我不敢相信我错过了这一个…谢谢!
builder.setView(view) // hope you know the view parameter