2012-09-12 49 views
5

我使用的AspectJ與Android定義,我成功地捕捉調用View.setOnClickListener()此方面:捕捉View.setOnClickListener()通過XML

public aspect Test { 

    pointcut callPointcut(View view, OnClickListener listener) : call(void View.setOnClickListener(OnClickListener)) && target(view) && args(listener); 

    @SuppressAjWarnings // Exported advice 
    before(View view, OnClickListener listener) : callPointcut(view, listener) 
    { 
     Log.d("AspectJ", "Attempt to set onClick listener on view " + Integer.toHexString(view.getId())); 
     Log.d("AspectJ", "Aspect has executed."); 
     Log.d("AspectJ", listener.toString()); 
    } 
} 

不幸的是,這並沒有抓住聽衆建立與在佈局XML中。有什麼辦法可以捕捉到這個?

回答

1

你不會成爲能夠做到這一點的方式。

如果我正確理解它,那麼您需要在Views上監聽setOnClickListener()的調用。

當您在xml中設置onclick屬性時,它從未被調用過。 Listener在創建View時直接設置。 setOnClickListener()永遠不會被調用。

唯一的解決方案是手動檢查所有的視圖 - 這不建議,也可能不是你想要的。

+0

我不介意以編程方式檢查所有視圖,但我將如何檢查監聽器?沒有'getOnClickListener()'(但有一個'getOnFocusChangeListener()'...)P) – m0skit0

+1

哦,哇。我不知道這是爲什麼。我不好,我以爲有一個。對不起,幫不了你。我對aspectj不熟悉,我只是可以告訴你,在視圖的構造函數中解析xml時(在擴展布局時),直接設置onclicklistener。但是,您可以自己分析xml,然後您將獲得所調用的方法名稱,但不會收聽偵聽器對象。它可能是很多工作。 –

+0

是的,我想過解析XML。感謝您的回答:) – m0skit0

-5

可以使用,

<TextView 
      android:id="@+id/display_name" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:padding="3dp" 
      android:onClick="testclick" 
      android:textSize="16sp" 
      android:textStyle="bold" > 

加關注您的活動裏面的API,

public void textclick(View v){ 

//TODO :anything you want 
} 
+1

與我在此處詢問的內容無關。 – m0skit0

1

我不是100%確定這是否可行,但爲什麼不修改View類以擁有mOnClickListener屬性。然後,當OnClickListener即將在自定義View類中設置時,將該屬性設置爲「new OnClickListener(){...}」,然後使用該屬性調用setOnClickListener。然後,您將添加一個名爲getOnClickListener()的公共方法,您可以調用您的自定義View對象來返回該偵聽器。

這可能是一個迂迴/乏味的方式,因爲您還需要不僅包含您的自定義View類,還需要包含您計劃在XML中使用的View的每個子類,並更改它們的超類以使用您的自定義View,不是Android的。然後,您需要更改您的XML元素以反映該問題,即com.yourpackage.Button等。

+1

我也想到了這一點,但方式太多的工作子類化每個視圖的孩子,也有第三方開發人員使用這個類...我從這得到的好處是太瘦了,這樣一個巨大的努力!無論如何感謝您的回答:) – m0skit0