1. 程式人生 > >Android fragment XML中的button找不到Onclick函式的解決方法

Android fragment XML中的button找不到Onclick函式的解決方法

開始學習安卓時,被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中尋找函式

,因為通過程式程式碼設定OnclickListener我們可以在onCreateView中處理點選事件,XML的onclick卻不能,這也就導致了我前面所遇到的問題。

那麼找到原因問題就就好解決了,在onCreateView中使用onclicklistener監聽點選事件,具體程式碼如下:

Java檔案:

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);
	}

}
XML檔案:
 <Button
                style="@style/arrowButton"
                android:id="@+id/changeInterest"
                android:text=">"
                android:onClick="ToInterest"/>

現在onclick函式就可以順利的在fragment頁面執行啦!ヽ(●´∀`●)ノ