我有一个具有2个线性布局的自定义 View :第一个是 View 的标题,第二个是details View 。
在自定义 View 中, header Linearlayout的OnClickListener已定义:触发时,它折叠/扩展第二个linearlayout。
我想做的是为标题的OnClickListener事件添加更多功能(即:折叠/展开第二个布局并显示Toast)。
我无法修改自定义 View 的源代码。我试图设置一个新的OnClickListener,但它隐藏了初始事件(折叠/展开)。
我应该如何实现呢?
我的自定义 View 的源代码:
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();
}
});
}
}
我想做的是向我的 Activity 中已定义的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();
}
}
});
}
最佳答案
一个简单的解决方案是获取原始的OnClickListener,然后将其激发到新的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来获取它。它存储在field 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();
}
});
我并没有真正为正确处理所有异常而烦恼,但是足以理解这个想法。
它看起来可能很杂乱,但是实际上只有5行新代码可以解决您的问题。
关于android - 如何以编程方式触发Onclick事件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10894440/