Android fragment XML中的button找不到Onclick函式的解決方法
阿新 • • 發佈:2019-01-27
開始學習安卓時,被XML中的onClick方法深深吸引,只需在Java檔案中定義好相關函式,然後在onClick屬性中設定要呼叫的函式名即可,每次都被這種簡單而高效的神奇方法折服……一直很好奇為什麼有這麼好用的onClick屬性,還有那麼多人要去捨近求遠的設定onClickListener,重寫onclick函式呢。
直到有一次與與別人合程式碼時——具體工作是將我寫的幾個頁面移植到隊友寫的mainActivity中的幾個fragment裡,我無腦把XML檔案拷過去,把對應函式拷到每個fragment的java檔案中,結果發現!我的所有onclick函式都壞了!0口0||| 每次點按鈕整個專案就崩掉!
報以下錯:
java.lang.IllegalStateException: Could not find method ToInterest(View) in a parent or ancestor Context for android:
onClick attribute defined on view class android.widget.Button with id 'changeInterest'
查過一些資料後才發現,原來onclick屬性並不能用到fragment的xml裡……由於fragment是儲存在inflater裡的,只有fragment生成後才可才能通過ID找到fragment中的元素,這樣直接的給onClick指定函式名,顯然沒有給函式和按鈕之間提供直接的對應關係。所以報錯提示沒有找到想要的函式。
那麼這時候我才開始思考OnClickListener存在的意義,明白了原來android: onClick 與 OnClickListener原來是完全相同的機制:View.OnclickListener是一個介面,定義了onclick這函式,如果你使用onclick函式時沒有實現OnclickListener這個介面,android會自己幫你呼叫這個介面。如果你手動實現了這個介面,java後臺便不需要幫你實現,只需等待click這個動作並呼叫OnclickListner中的函式即可。那麼既然java可以自動幫我們實現這個介面,為什麼我們還要手動定義呢?這是Onclick的侷限性所致,onclick只能在當前的Activity中尋找函式
那麼找到原因問題就就好解決了,在onCreateView中使用onclicklistener監聽點選事件,具體程式碼如下:
Java檔案:
XML檔案:public class activity_settingmain extends Fragment { Button btnToInterest; private static final String TAG = "activity_settingmain"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.activity_settingmain, null); //通過id找到需要被監聽的button btnToInterest= (Button)view.findViewById(R.id.changeInterest); btnToInterest.setOnClickListener(new View.OnClickListener(){ //為找到的button設定監聽 @Override //重寫onClick函式 public void onClick(View v){ ToInterest(v)} }); return view; } public void ToInterest(View view) { //此處定義點選後需要進行的操作,以下程式碼實現了簡單地頁面跳轉 Intent intent = new Intent(activity_settingmain.this.getActivity(), ModifyGender.class); startActivity(intent); } }
<Button
style="@style/arrowButton"
android:id="@+id/changeInterest"
android:text=">"
android:onClick="ToInterest"/>
現在onclick函式就可以順利的在fragment頁面執行啦!ヽ(●´∀`●)ノ