gpt4 book ai didi

android - 为什么我可以在 Activity/提要中使用 onClick,但不能在对话框 fragment 中使用?

转载 作者:行者123 更新时间:2023-11-29 16:01:49 25 4
gpt4 key购买 nike

例如,在 Android 上,这是一个优秀的代码 fragment ,

显示如何在对话框 fragment 上实现五个按钮...


android DialogFragment android:onClick="buttonCancel" causes IllegalStateException could not find a method

在您的 DialogFragment 中,您必须为所有按钮/ ImageView 等setOnClickListener(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;
}
}

这一切都太棒了。但是。


在我的主要 Activity 中,我有一个 ListView。自定义单元格有五个按钮。非常简单,在主要 Activity 中,我有五个例程,可以随意命名...

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!”)......

enter image description here

太棒了!


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

我做错了什么? android 专家可以解释两者之间的根本区别是什么吗?郑重声明,我的项目只有 4.1+。

谢谢!!


在这里,我使用上述第一种方法粘贴了 fragment 的完整示例。

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);
}

}

最佳答案

这实际上是一个非常简单的答案,但您必须首先记住 Android 1.0 没有 Fragments

首先让我们看看真正的 Activity 是什么:

java.lang.Object
↳ android.content.Context
↳ android.content.ContextWrapper
↳ android.view.ContextThemeWrapper
↳ android.app.Activity

一个扩展 Context 的对象,就是这样。

因此,当您扩充 XML 布局时,该方法 inflate 会像这样创建和设置 View :

View v = new View(context) // see the context here ?

然后当你在你的 XML onClick:commentsClick 上设置时,当你点击时发生的事情是:

getContext().commentsClick(View.this); // look, the context again

那么让我们分析一下:

XML onClick 尝试回调到上下文,也就是说,回调到膨胀它的 Activity 。看到 IllegalStateException 消息说找不到方法了吗?好吧,因为它不在 Activity 中。如果您将 commentsClick 放在创建 DialogFragment 的 Activity 中,它可能会起作用,但这只是糟糕的 O.O.,对吧?

XML onClick 是一个很好的促进者,可以避免在巨大的 switch(int) 情况下,但它是一个无法扩展到其他解决方案的解决方案可能会膨胀布局的类,例如 Fragments

关于android - 为什么我可以在 Activity/提要中使用 onClick,但不能在对话框 fragment 中使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23848285/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com