Android 为什么我可以在活动/提要中使用onClick,但不能在对话框片段中使用?

Android 为什么我可以在活动/提要中使用onClick,但不能在对话框片段中使用?,android,android-activity,android-dialogfragment,Android,Android Activity,Android Dialogfragment,例如,在Android上,这里有一个优秀的代码片段 显示如何在对话框片段上实现五个按钮 在DialogFragment中,必须设置ClickListener(this)所有按钮/图像视图等 然后实现View.OnClickListener,并有如下例程 public void onClick(View v) { Utils.Log("Fucking 'A' sort of... "); switch (v.getId()) { case

例如,在Android上,这里有一个优秀的代码片段

显示如何在对话框片段上实现五个按钮


在DialogFragment中,必须设置ClickListener(this)所有按钮/图像视图等

然后实现View.OnClickListener,并有如下例程

public void onClick(View v)
    {
    Utils.Log("Fucking 'A' sort of... ");
    switch (v.getId())
        {
        case R.id.postfragment_send:
            break;
        etc etc etc
        default:
            break;
        }
    }
太棒了。但是


在我的主要活动中,我有一个列表视图。自定义单元格有五个按钮。很简单,在主要活动中,我有五个例程,命名为我喜欢的

public void clickedComments(View v)
    {
    int position = feed.getPositionForView(v);
    ...etc etc
    }
public void clickedExplosions(View v)
    {
    int position = feed.getPositionForView(v);
    ...etc etc
    }
public void clickedTanks(View v)
    {
    int position = feed.getPositionForView(v);
    ...etc etc
    }
然后你就这么做了,这是难以置信的简单(“螺丝Xcode!”)

太棒了


我的问题是,为什么我不能在对话框片段中使用“onClick系统”?

我做错了什么?安卓专家能解释一下两者的根本区别吗?为了记录在案,我的项目只有4.1+个

谢谢


在这里,我使用上面描述的第一种方法粘贴一个片段的完整示例

public class HappyPopupFragment extends DialogFragment implements View.OnClickListener
    {
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState)
        {
        Dialog dialog = super.onCreateDialog(savedInstanceState);

        dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
        dialog.getWindow().setGravity(Gravity.CENTER_HORIZONTAL | Gravity.TOP);
        dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);

        return dialog;
        }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
        View view = inflater.inflate(R.layout.happy_popup, container);
        _setupButtons(view);
        return view;
        }

    public void onClick(View v)
        {
        Utils.Log("Fucking 'A' sort of... ");
        switch (v.getId())
            {
            case R.id.button_a:
                Utils.Log("tanks !!");
                break;

            case R.id.button_b:
                Utils.Log("bombs !!");
                break;

            case R.id.button_c:
                Utils.Log("guns !!");
                break;

            case R.id.button_d:
                Utils.Log("ammo !!");
                break;

            default:
                break;
            }
        }

    private void _setupButtons(View view)
        {
        ((ImageView)view.findViewById(R.id.button_a)).setOnClickListener(this);
        ((ImageView)view.findViewById(R.id.button_b)).setOnClickListener(this);
        ((ImageView)view.findViewById(R.id.button_c)).setOnClickListener(this);
        ((TextView)view.findViewById(R.id.button_d)).setOnClickListener(this);
        }

    }

您可以在每个视图及其子类上使用
onClickListener

setOnClickListener将实现
View.OnclickListener
的类的实例作为参数

如果在
setOnClickListener(this)
上出现错误,则表示此引用的对象是未实现
视图的类的对象。OnClickListener


换句话说

下面介绍如何使onClickListener在自定义对话框片段的自定义列表视图中为自定义单元格工作

在列表视图的适配器类(1)中,您将拥有为每个单元格设置值的代码。(将文本和操作系统设置为打开。)事实上,在相同的代码集中,每个单元格按钮的ClickListener:

v.nameTV.setText( "User Name" );
v.inviteIV.setOnClickListener( ourBoss ); // like this
问题是如何设置侦听器。事实上,您希望它成为您的对话片段。“我们的老板”将是对话框片段。因此(2)当对话框片段创建适配器时,将其传入:

在创建适配器的对话框片段中:

fosAdapter = new YourHappyAdapter(
   getActivity(), getActivity().getLayoutInflater(),
   otherStuff, otherStuff, this);
在适配器本身中

public class YourHappyAdapter extends BaseAdapter
  {
  YourDialogFragmentClass ourBoss;

  public FosAdapter(
        Context context, LayoutInflater inflater,
         blah, blah,
         YourDialogFragmentClass ydfc)
        {
        blah
        blah

        ourBoss = ydfc;
        }
最后,(3)以普通方式,在DialogFragmentClass中,您可以使用通常的onClick代码!!万岁,你完了

  public void onClick(View v)
    {
    switch (v.getId())
      {
      case R.id.submit_button: // from the overall fragment screen
        _searchNow();
        break;

      case R.id.cell_button:      // that one's from a cell.
        Utils.Log("IT WORKED !!!!!!!!!!!!!!!!! !!");
        userWantsANewTank(v);
        break;

      default:
        break;
      }
    }
在执行自定义表和自定义对话框片段时,使用“老式”xml便捷onClick方法(本质上)是不现实的


希望它能帮助别人

您可以在每个视图及其子类上使用
onClickListener

setOnClickListener将实现
View.OnclickListener
的类的实例作为参数

如果在
setOnClickListener(this)
上出现错误,则表示此引用的对象是未实现
视图的类的对象。OnClickListener


换句话说

下面介绍如何使onClickListener在自定义对话框片段的自定义列表视图中为自定义单元格工作

在列表视图的适配器类(1)中,您将拥有为每个单元格设置值的代码。(将文本和操作系统设置为打开。)事实上,在相同的代码集中,每个单元格按钮的ClickListener:

v.nameTV.setText( "User Name" );
v.inviteIV.setOnClickListener( ourBoss ); // like this
问题是如何设置侦听器。事实上,您希望它成为您的对话片段。“我们的老板”将是对话框片段。因此(2)当对话框片段创建适配器时,将其传入:

在创建适配器的对话框片段中:

fosAdapter = new YourHappyAdapter(
   getActivity(), getActivity().getLayoutInflater(),
   otherStuff, otherStuff, this);
在适配器本身中

public class YourHappyAdapter extends BaseAdapter
  {
  YourDialogFragmentClass ourBoss;

  public FosAdapter(
        Context context, LayoutInflater inflater,
         blah, blah,
         YourDialogFragmentClass ydfc)
        {
        blah
        blah

        ourBoss = ydfc;
        }
最后,(3)以普通方式,在DialogFragmentClass中,您可以使用通常的onClick代码!!万岁,你完了

  public void onClick(View v)
    {
    switch (v.getId())
      {
      case R.id.submit_button: // from the overall fragment screen
        _searchNow();
        break;

      case R.id.cell_button:      // that one's from a cell.
        Utils.Log("IT WORKED !!!!!!!!!!!!!!!!! !!");
        userWantsANewTank(v);
        break;

      default:
        break;
      }
    }
在执行自定义表和自定义对话框片段时,使用“老式”xml便捷onClick方法(本质上)是不现实的


希望它能帮助别人

这实际上是一个非常简单的答案,但你必须记住Android 1.0没有
片段

首先,让我们看看什么是真正的活动:

java.lang.Object
   ↳    android.content.Context
       ↳    android.content.ContextWrapper
           ↳    android.view.ContextThemeWrapper
               ↳    android.app.Activity
扩展
上下文的对象,就是这样

因此,当您膨胀XML布局时,该方法
inflate
正在创建和设置如下视图:

View v = new View(context) // see the context here ?
然后,当您设置XML
onClick:comments单击时,例如,当您单击时发生的情况是:

getContext().commentsClick(View.this); // look, the context again
让我们分析一下:

XML
onClick
试图回调上下文,这意味着回调使上下文膨胀的活动。查看
IllegalStateException
消息是否表示找不到该方法?因为它不在活动中。如果您在创建DialogFragment的活动中放置
commentsClick
,它可能会工作,但这只是糟糕的O.O.,对吗


XML
onClick
是一个很好的工具,可以避免在巨大的
switch(int)情况下使用它,但是它是一个解决方案,它不能扩展到可能会膨胀布局的其他类,例如
片段

,这实际上是一个非常简单的答案,但是你必须记住Android 1.0没有
片段

首先,让我们看看什么是真正的活动:

java.lang.Object
   ↳    android.content.Context
       ↳    android.content.ContextWrapper
           ↳    android.view.ContextThemeWrapper
               ↳    android.app.Activity
扩展
上下文的对象,就是这样

因此,当您膨胀XML布局时,该方法
inflate
正在创建和设置如下视图:

View v = new View(context) // see the context here ?
然后,当您设置XML
onClick:comments单击时,例如,当您单击时发生的情况是:

getContext().commentsClick(View.this); // look, the context again
让我们分析一下:

XML
onClick
试图回调上下文,这意味着回调使上下文膨胀的活动。查看
IllegalStateException
消息是否表示找不到该方法?因为它不在活动中。如果您在活动中输入
注释,请单击