我怎样才能在android中以编程方式触发Onclick事件?

我有一个自定义视图与2个lineat布局:第一个是视图的标题,第二个是详细信息视图。

在自定义视图中,标题Linearlayout的OnClickListener已经被定义:当它触发时,它会折叠/展开第二个线性布局。

我想要做的是添加更多的function到我的头的OnClickListener事件(即:折叠/展开第二个布局,并显示一个吐司)。

我无法修改自定义视图的源代码。 我试图设置一个新的OnClickListener,但它隐藏了最初的事件(崩溃/展开)。

我应该如何执行这个?

我的自定义视图的源代码:

public class ExpandoLayout extends ViewGroup { /* some declarations */ private Linearlayout header; private linearlayout footer; /* some code */ @override protected void onFinishInflate() { header= new LinearLayout(context); header.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { toggleExpand(); } }); } } 

我想要做的是将一些代码添加到我的活动中已定义的OnClickListener事件中。 类似的东西:

 public class myActivity extends Activity { private Linearlayout myCustomView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.rsdetail); myCustomView= (MyCustomView) findViewById(R.id.expanded); myCustomView.getChildAt(0).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if(v instanceof LinearLayout) { v.performClick(); Toast.makeText(getActivity(), "ExpandoOnClickListener", 2000).show(); } } }); } 

Solutions Collecting From Web of "我怎样才能在android中以编程方式触发Onclick事件?"

简单的解决办法是获得原始的OnClickListener,然后在新的启动:

 final OnClickListener preDefinedListener = myCustomView.getChildAt(0).getOnClickListner(); myCustomView.getChildAt(0).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if(v instanceof LinearLayout) { preDefinedListener.onClick(v); // calls default (defined by MyCustomView) Toast.makeText(getActivity(), "ExpandoOnClickListener", 2000).show(); } } }); 

可悲的是, View没有getOnClickListner() ,但我想你可以使用reflection来获得它。 它存储在字段 mOnClickListener ( source )中。

这是如何获得为您的布局定义的OnClickListener

 OnClickListener tmpOnClickListener = null; try { Class<View> cls = (Class<View>) Class.forName("android.view.View"); Field fld = cls.getDeclaredField("mOnClickListener"); fld.setAccessible(true); // because it is protected tmpOnClickListener = (OnClickListener) fld.get(myCustomView.getChildAt(0)); fld.setAccessible(false); // restore it's original property } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } final OnClickListener preDefinedListener = tmpOnClickListener; if (preDefinedListener != null) { myCustomView.getChildAt(0).setOnClickListener(new OnClickListener() { @Override public void onClick(View paramView) { preDefinedListener.onClick(paramView); Toast.makeText(getActivity(), "ExpandoOnClickListener", Toast.LENGTH_LONG).show(); } }); 

我没有真正理解正确的处理所有的exception,但足以得到这个想法。 它可能看起来很乱,但它实际上只是5行新的代码来解决你的问题。

你可以通过编程在一个View上引发点击事件来调用它的OnClickListener ,如下所示:

 view.performClick(); 

现在,如果你在第一个布局的OnClickListener下调用你的第二个布局,那么我希望它应该做的魔术

由于SDK 15你可以调用方法:

 view.callOnClick() 

如果你不能修改CustomView的代码,那么你有下面的选项。

  • 扩展CustomView。
  • 重写onClick()方法并将其作为侦听器绑定到第一个布局。
  • 在onClick()首先调用super.onClick()然后在下面添加你的附加function。

这样你就可以保留现有的代码并添加额外的function。