首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义View.OnClickListener中的DialogFragment

自定义View.OnClickListener中的DialogFragment
EN

Stack Overflow用户
提问于 2015-01-04 21:00:50
回答 2查看 4.4K关注 0票数 2

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

SettingsDialogFragment.java

代码语言:javascript
复制
 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)

代码语言:javascript
复制
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:orientation="vertical"
          android:layout_width="200dp"
          android:layout_height="wrap_content">
<EditText
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:gravity="center"
    android:scaleType="center"
    android:background="#00CCCC"
    android:contentDescription="@string/app_name"
    android:text="@string/dialog_settings_title"
    android:id="@+id/editText"/>
<Button
    android:id="@+id/colorButton_dialogSettings"
    android:inputType="textEmailAddress"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/color_picker_title"
    android:layout_below="@+id/editText"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    />

<RadioButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Stroke"
    android:layout_marginLeft="55dp"
    android:id="@+id/radioButtonStroke"
    android:checked="false"
    android:layout_below="@+id/colorButton_dialogSettings"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"/>

<RadioButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Fill"
    android:id="@+id/radioButton_fill"
    android:checked="false"
    android:layout_below="@+id/colorButton_dialogSettings"
    android:layout_toRightOf="@+id/radioButtonStroke"
    android:layout_toEndOf="@+id/radioButtonStroke"
    android:layout_marginLeft="10dp"
    />

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-05 00:18:18

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

代码语言:javascript
复制
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_dialogSettings)的引用,它来自视图组view..which,您为它引用了一个onclick侦听器。

代码语言:javascript
复制
builder.setView(inflater.inflate(R.layout.dialog_settings, null))

这里的代码设置对话框的内容视图。它膨胀了布局并完成了工作。因此,最终您的builder并不是将它的内容视图引用到view,而是一个新的膨胀的R.layout.dialog_settings布局。

,所以要解决这个问题,只需这样做

代码语言:javascript
复制
builder.setView(view) // hope you know the view parameter

view是在A行实例化的。

希望我讲得通,而且头脑清醒,让you..let我知道这是否有帮助

票数 6
EN

Stack Overflow用户

发布于 2015-01-04 21:20:12

新答案

将您的onCreateDialog更改为:

代码语言:javascript
复制
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 = (Button) findViewById(R.id.colorButton_dialogSettings);

**要求您编写自己的*的旧答案*

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

代码语言:javascript
复制
    @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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27770316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档