getOnClickListener()在Android的意见 [英] getOnClickListener() in Android views
问题描述
我需要一个getOnClickListener()在Android的意见。这样我可以分配一个临时的OnClickListener我的意见。 我想用这样的:
I need a getOnClickListener() for Views in Android. This way I can assign a temporary OnClickListener to my Views. I want to use it like this:
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);
}
});
}
的问题是,此功能doen't存在。我也无法从视图继承创建这个方法,因为所有类型的视图中可以传递给assignTempListener。有另一种方式来使用它?
The problem is that this function doen't exist. I also can't inherit from View to create this method, because all kind of Views can be passed to assignTempListener. Is there another way to use this?
编辑:在我的code犯点小错。
made a small mistake in my code.
推荐答案
您可以...做到这一点的反射。 *击鼓*
You can do this with...REFLECTION. *drum roll*
这条路线是充满了危险。
This route is fraught with peril.
我不建议这样做,作为类的内部结构,可以随时改变,但这里是你如何能做到这一点目前最多至Android 4.2.2,如果它是真的不可避免的:
I don't recommend it, as the internal structure of the class can change at any time, but here's how you can do it currently up to Android 4.2.2 if it's truly unavoidable:
/**
* 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;
}
这篇关于getOnClickListener()在Android的意见的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!