我需要Android中的Views的getOnClickListener()。这样我就可以为我的视图分配一个临时的OnClickListener。 我想这样使用它:
private View.OnClickListener oldListener;
public void assignTempListener(View view) {
oldListener = view.getOnClickListener(); // doesn't exist
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// some code
v.setOnClickListener(oldListener);
}
});
}
问题是这个功能不存在。我也无法从View继承创建此方法,因为所有类型的视图都可以传递给assignTempListener。有没有其他方法可以使用它?
编辑:在我的代码中犯了一个小错误。
答案 0 :(得分:25)
你可以用...... REFLECTION 来做到这一点。 *鼓卷*
这条路线充满了危险。
我不推荐它,因为类的内部结构可以随时改变,但是如果它真的不可避免的话,这就是你现在如何能够实现Android 4.2.2:
/**
* Returns the current View.OnClickListener for the given View
* @param view the View whose click listener to retrieve
* @return the View.OnClickListener attached to the view; null if it could not be retrieved
*/
public View.OnClickListener getOnClickListener(View view) {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
return getOnClickListenerV14(view);
} else {
return getOnClickListenerV(view);
}
}
//Used for APIs lower than ICS (API 14)
private View.OnClickListener getOnClickListenerV(View view) {
View.OnClickListener retrievedListener = null;
String viewStr = "android.view.View";
Field field;
try {
field = Class.forName(viewStr).getDeclaredField("mOnClickListener");
retrievedListener = (View.OnClickListener) field.get(view);
} catch (NoSuchFieldException ex) {
Log.e("Reflection", "No Such Field.");
} catch (IllegalAccessException ex) {
Log.e("Reflection", "Illegal Access.");
} catch (ClassNotFoundException ex) {
Log.e("Reflection", "Class Not Found.");
}
return retrievedListener;
}
//Used for new ListenerInfo class structure used beginning with API 14 (ICS)
private View.OnClickListener getOnClickListenerV14(View view) {
View.OnClickListener retrievedListener = null;
String viewStr = "android.view.View";
String lInfoStr = "android.view.View$ListenerInfo";
try {
Field listenerField = Class.forName(viewStr).getDeclaredField("mListenerInfo");
Object listenerInfo = null;
if (listenerField != null) {
listenerField.setAccessible(true);
listenerInfo = listenerField.get(view);
}
Field clickListenerField = Class.forName(lInfoStr).getDeclaredField("mOnClickListener");
if (clickListenerField != null && listenerInfo != null) {
retrievedListener = (View.OnClickListener) clickListenerField.get(listenerInfo);
}
} catch (NoSuchFieldException ex) {
Log.e("Reflection", "No Such Field.");
} catch (IllegalAccessException ex) {
Log.e("Reflection", "Illegal Access.");
} catch (ClassNotFoundException ex) {
Log.e("Reflection", "Class Not Found.");
}
return retrievedListener;
}
答案 1 :(得分:4)
您可以覆盖该类并为您的视图声明一个onClicklistener,并为onClickListener字段编写setter和getter:
public class SAutoBgButton extends ImageButton {
public View.OnClickListener mOnClickListener;
@Override
public void setOnClickListener(OnClickListener l) {
super.setOnClickListener(l);
mOnClickListener = l;
}
public OnClickListener getmOnClickListener() {
return mOnClickListener;
}
}
答案 2 :(得分:1)
使用
oldListener = new view.OnClickListener() {
@Override
public void onClick(View v) {
// some code
v.setOnClickListener(oldListener);
}
});
而不是
oldListener = view.getOnClickListener(); // doesn't exist
getOnClickListener 不是View的任何方法,也不是当前API的Button的任何方法,请参阅文档以获取更多详细信息
http://developer.android.com/reference/android/view/View.OnClickListener.html
答案 3 :(得分:1)
答案很简单
OnClickListener ocl = new OnClickListener {
@Override
public void onClick(View view) {
clickableView.performClick();
}
}
onclicklistener的全部功能,只有一件事-您不能将任何视图作为参数传递给它,clickableView
将成为处理程序,但在大多数情况下就足够了
答案 4 :(得分:0)
Niet的!
给出的答案中的oldListener在每种情况下都被重新定义,并且它的旧状态或定义都会丢失,无论它的名字是否正在冒充。
遵循这项技巧: Get current onClickListener of an Android View object 'old'监听器将在抽象类的onClick方法中设置 任何临时监听器都会使用setOnClickListener以及对super的调用,以便(或)在适当的时候(重新)设置旧的监听器
临时监听器设置代码无需知道“旧”监听器是什么 仍然需要某种形式的协调,以便那个或那些听众的作者将它们抽象化,并使用onClick方法来设置点击监听器,简而言之,就是遵循协议。
您可能希望绕过onclicklistener View成员的protected或private限定符:http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.1_r2/android/view/View.java#View.0mOnClickListener 然后做一点http://www.jguru.com/faq/view.jsp?EID=321191 这将使你成为听众。
你甚至可能想要编写自己的getOnClickListener,或任何使用instrospection方法的getter,如果它当然有用的话:)
:)