为什么Android无法在片段中找到我的onClick方法?

时间:2017-09-19 19:47:53

标签: java android android-fragments

所以我在片段中有一个简单的按钮,点击它时我有一个例外。 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)相同的方法可以正常工作。当前上下文中的方法查找有问题。

3 个答案:

答案 0 :(得分:4)

您无法通过引用XML中的方法来处理片段中的click事件。这仅适用于您的活动中实施该方法的情况。我认为这是因为活动是膨胀视图的上下文,但视图没有任何对片段的引用。

这就是抛出异常的原因,因为您的活动中缺少该方法。

您应该在片段中使用findViewById()。setOnClickListener()。

答案 1 :(得分:1)

onClick属性旨在与Activities NOT Fragments一起使用。看起来使用OnClickListener是您案例中最简单的解决方案。 另一个选项(我最喜欢的)是使用ButterKnife库,它允许您使用注释处理该例程:

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

答案 2 :(得分:0)

您从MainActivity中扩展片段,因此它放入主布局中,因此xml的上下文是实例化片段的活动。确保您的MainActivity中有onApplyButtonPressed(View v)方法。