2015-04-01 46 views
21

我有一個活動,當Web請求完成時膨脹視圖。 一些該視圖的部件必須被連接到一個onClick方法,所以我有:@OnClick陣列與可選ID(黃油刀)

@OnClick({R.id.bt1, R.id.bt2, R.id.inflated_bt1, R.id.inflated_bt2}) 
public void onClick(View view) { 
    // ... 
} 

作爲R.id.inflated_bt1R.id.inflated_bt2創建應用程序時,不存在,它拋出異常提示設置一個@Optional註釋。

找不到方法'onClick',ID爲XXXXXXXX的必需視圖'inflated_bt1'。如果此視圖是可選的,則添加'@Optional'註釋。

有沒有辦法使用@Optional註釋設置一些視圖,並在視圖膨脹時注入它們?或者,還有其他方法可以做到嗎?

謝謝

回答

18

正確的答案是使用@Nullable註解。請參閱Butterknife home page。用例:

import android.support.annotation.Nullable; 

@Nullable 
@OnClick(R.id.maybe_missing) 
void onMaybeMissingClicked() { 
    // TODO ... 
} 

編輯:

自從我寫了這個答案,它是接受了一年,Butterknife文檔改變,完成這個當前的首選方法是使用@Optional註解。既然這是被接受的答案,我認爲更新它來解決當前的實踐很重要。例如:

import butterknife.Optional; 

@Optional 
@OnClick(R.id.maybe_missing) 
void onMaybeMissingClicked() { 
    // TODO ... 
} 
+0

根據ButterKnife github頁面,「添加一個@Nullable註釋到字段或@Optional註釋到方法」http://jakewharton.github.io/butterknife/ – TheoKanning 2017-02-14 00:07:25

+3

@TheoKanning你認真地downvote我的答案?文檔已更改。當我在一年前回答這個問題時,沒有一個「可選」。如果答案需要更新,請更新它! – AutonomousApps 2017-02-14 02:05:11

36

你的方法頂部只需添加@Optional註釋,如下面的代碼所示:

@Optional 
@OnClick({R.id.bt1, R.id.bt2, R.id.inflated_bt1, R.id.inflated_bt2}) 
public void onClick(View view) { 
    // ... 
} 

有,你沒有R.id.inflated_bt1佈局XML的情況下,你在你的Activity上使用。對於這種情況,您必須使用@Optional批註。

如果您只使用@OnClick標註在YourClass$$ViewInjector源代碼如下所示:

view = finder.findRequiredView(source, 2131230789, "method 'onClick'"); 
view.setOnClickListener(
    new butterknife.internal.DebouncingOnClickListener() { 
    @Override public void doClick(
     android.view.View p0 
    ) { 
     target.onClick(); 
    } 
    }); 

findRequiredView拋出IllegalStateException時的觀點是null的方法。

但是當你使用另外@Optional註釋,生成的代碼看起來像下面

view = finder.findOptionalView(source, 2131230789); 
if (view != null) { 
    view.setOnClickListener(
    new butterknife.internal.DebouncingOnClickListener() { 
     @Override public void doClick(
     android.view.View p0 
    ) { 
     target.onClick(); 
     } 
    }); 
} 
+0

我該如何使用ButterKnife.Finder? JavaDoc顯示「不使用」消息,我無法創建它: 「無法繼承最終類butterknife.ButterKnife.Finder」 – 2015-04-13 06:58:16

+0

爲什麼要使用這樣的類? – 2015-04-29 10:49:27

2
@Nullable 
@OnClick({R.id.bt1, R.id.bt2, R.id.inflated_bt1, R.id.inflated_bt2}) 
public void onClick(View view) { 
    // ... 
} 

如果由Butterknife文檔並且還通過@AutonomousApps說,那麼你就可以作爲可作爲IDS即使你不使用他們所有的時間包括包括空。

如果不使用appcompact庫,請記住包含註釋支持庫。檢查鏈接Support Annotations