簡體   English   中英

為什么Android在片段中找不到我的onClick方法?

[英]Why Android cannot find my onClick method inside fragment?

所以我在片段中有一個簡單的按鈕,單擊它時有一個異常。 Fragmens出現很好。

片段代碼:

    public void onApplyButtonPressed(View view) {
        System.out.println("Apply button clicked");
//        viewToFilterData();
//        if (mListener != null) {
//            mListener.onFiltersApplyButtonPressed(userData);
//        }
    }

片段的XML布局

<Button
    android:id="@+id/fragment_filters_apply_button"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:onClick="onApplyButtonPressed"
    android:text="@string/fragment_filters_apply_button" />

以及如何將片段附加到主要活動中:

FiltersFragment filtersFragment = FiltersFragment.newInstance(userData);
getSupportFragmentManager().beginTransaction().add(R.id.activity_main_filters_page, filtersFragment).commit();

誰能看到為什么發生此錯誤?

 java.lang.IllegalStateException: Could not find method onApplyButtonPressed(View) in a parent or ancestor Context for android:onClick attribute defined on view class android.support.v7.widget.AppCompatButton with id 'fragment_filters_apply_button'
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.resolveMethod(AppCompatViewInflater.java:327)
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:284)
    at android.view.View.performClick(View.java:4438)
    at android.view.View$PerformClick.run(View.java:18422)
    at android.os.Handler.handleCallback(Handler.java:733)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:5017)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
    at dalvik.system.NativeStart.main(Native Method)

PS:使用與使用者相同的方法進行View.OnClickListener#onClick(View)正常工作。 當前上下文中的方法查找有問題。

您不能通過引用XML中的方法來處理片段中的click事件。 僅當您的活動中實現了該方法時,此方法才有效。 我認為這是因為該活動具有誇張視圖的上下文,但是該視圖沒有對該片段的任何引用。

這就是為什么由於活動中缺少該方法而引發異常的原因。

您應該在片段中使用findViewById()。setOnClickListener()。

onClick屬性旨在與Activities NOT Fragments一起使用。 看起來,在您的情況下,使用OnClickListener是最簡單的解決方案。 另一個選擇(我最喜歡)是使用ButterKnife庫,該庫允許您使用批注處理該例程:

@OnClick(R.id.fragment_filters_apply_button)
void onApplyButtonClick(View view){
//your code
}

您可以從MainActivity中填充片段,因此它將放入主布局,因此xml的上下文是實例化片段的活動。 確保MainActivity中具有onApplyButtonPressed(View v)方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM