[英]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.