안드로이드(android) 프레그먼트(Fragment)에서 android:onClick을 핸들링하는 방법
프레그먼트(Fragment) android:onClick 이벤트 핸들링 방법
프레그먼트(Fragment)에서 Layout에서 android:onClick는 사용할 수 없다. 만약 사용하게 된다면, 아래와 같은 오류를 직면하게 된다. 액티비티(Activity)에서는 가능하지만 프레그먼트에서는 사용할 수 없다.
<LinearLayout
android:id="@+id/top_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="onALayoutClicked"
android:orientation="vertical">
</LinearLayout>
java.lang.IllegalStateException: Could not find method onALayoutClicked(View) in a parent or ancestor Context for android:onClick attribute defined on view class android.widget.LinearLayout with id 'top_layout'
at android.view.View$DeclaredOnClickListener.resolveMethod(View.java:6050)
at android.view.View$DeclaredOnClickListener.onClick(View.java:6007)
at android.view.View.performClick(View.java:7169)
at android.view.View.performClickInternal(View.java:7139)
at android.view.View.access$3900(View.java:808)
at android.view.View$PerformClick.run(View.java:27481)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7615)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:964)
프레그먼트에서는 OnClickListener를 상속 받아서 구현해야한다. onClick메소드를 오버라이드해줘야한다. 그리고 난 후 findViewById를 사용하여 레이아웃을 선언해주고 레이아웃에 setOnClickListener(this) 메소드를 초기화 주어야 한다.
public class SlideshowFragment extends Fragment implements View.OnClickListener {
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_slideshow, container, false);
LinearLayout layout1 = root.findViewById(R.id.top_layout);
layout1.setOnClickListener(this);
.............................
}
@Override
public void onClick(View v) {
switch(v.getId())
{
case R.id.top_layout:
{
if(isAvisiable) layout1.setVisibility(View.GONE);
else layout1.setVisibility(View.VISIBLE);
break;
}
}
}
}
액티비티에서도 OnClickListener를 상속받아 구현해서 동일하게 사용이 가능하다. 그에 비해 프레그먼트에서의 사용에서의 약간의 제약은 있는 듯 하다.