Android 为什么我可以在活动/提要中使用onClick,但不能在对话框片段中使用?
例如,在Android上,这里有一个优秀的代码片段 显示如何在对话框片段上实现五个按钮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
在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 ?
然后,当您设置XMLonClick:comments单击时,例如,当您单击时发生的情况是:
getContext().commentsClick(View.this); // look, the context again
让我们分析一下:
XMLonClick
试图回调上下文,这意味着回调使上下文膨胀的活动。查看IllegalStateException
消息是否表示找不到该方法?因为它不在活动中。如果您在创建DialogFragment的活动中放置commentsClick
,它可能会工作,但这只是糟糕的O.O.,对吗
XMLonClick
是一个很好的工具,可以避免在巨大的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 ?
然后,当您设置XMLonClick:comments单击时,例如,当您单击时发生的情况是:
getContext().commentsClick(View.this); // look, the context again
让我们分析一下:
XMLonClick
试图回调上下文,这意味着回调使上下文膨胀的活动。查看IllegalStateException
消息是否表示找不到该方法?因为它不在活动中。如果您在活动中输入注释,请单击