마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

android fragment onclick [mvvm]

0 추천

안녕하세여 안드로이드 프레그먼트에서 onclick 시 나오는 에러때매 문의드립니다 

 

뷰모델

fun moveStep(newLoginStep: SignUpFragStep) {
        val oldLoginStep = _signUpStep.value
        _signUpStep.value = newLoginStep

        //navigator?.dismissProgressDialog()

        when (newLoginStep) {
            SignUpFragStep.FIRST -> navigator?.setupViewFragment(SignUpFirstFragment.newInstance())
            SignUpFragStep.SECOND -> navigator?.setupViewFragment(SignUpSecondFragment.newInstance())
            SignUpFragStep.THIRD -> navigator?.setupViewFragment(SignUpThirdFragment.newInstance())
            SignUpFragStep.FOURTH -> navigator?.setupViewFragment(SignUpFourthFragment.newInstance())
        }

        Timber.d("moveStep: $oldLoginStep -> $newLoginStep")
    }

 

프래그먼트

enum class SignUpFragStep {
    FIRST,
    SECOND,
    THIRD,
    FOURTH;
}

버튼

 <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:clickable="true">

            <Button
                android:id="@+id/next_btn"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="15dp"
                android:background="@drawable/btn_yellow_round"
                android:onClick="@{(v) -> signUpViewModel.moveStep(SignUpFragStep.SECOND)"
                android:text="@string/confirm"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent" />

        </androidx.constraintlayout.widget.ConstraintLayout>

로그

java.lang.IllegalStateException: Could not find method @{(v) -> signUpViewModel.moveStep(SignUpFragStep.SECOND)(View) in a parent or ancestor Context for android:onClick attribute defined on view class androidx.appcompat.widget.AppCompatButton with id 'next_btn'
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.resolveMethod(AppCompatViewInflater.java:447)
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:405)
        at android.view.View.performClick(View.java:7448)
        at android.view.View.performClickInternal(View.java:7425)
        at android.view.View.access$3600(View.java:810)
        at android.view.View$PerformClick.run(View.java:28305)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

 

입니다 . 

 

여기서 계속 죽는데 어디서 잘못된지 모르겠어서요 

혹시 조언 부탁드려도 될까요? 

버튼 클릭 에러같은데 구글링해보고 이것저것 해봤는데 잘 되지 않아서요 

공과근성 (5,980 포인트) 님이 2020년 12월 28일 질문

1개의 답변

0 추천
 
채택된 답변
<Button
            android:id="@+id/test2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="@{(view) -> viewModel.click2(view, 2)}"

            ...

Android:onClick 메쏘드는 기본적으로 View를 전달하기 때문에 추가적인 파라미터를 넣으려면
위에서 처럼 선언해야 합니다.

public void click2(View v, int i) {
        String vid = ctx.getResources().getResourceEntryName(v.getId());
        Log.d("",vid + ".click2: "+i);
    }

받을 때는 뷰모델에서 위와 같이 받으면 됩니다.

파라미터를 굳이 던지지 말고, 위의 코드처럼 id를 받아와서 처리하면
굳이 추가적인 파라미터를 넣지 않아도 어느 정도 어느 View를 클릭했는지 알 수 있죠.
아니면 전달하고자 하는 파라미터를 ViewModel에 값을 넣고,
함수 호출시 ViewModel의 값을 참조해서 처리해도 됩니다.
Will Kim (43,170 포인트) 님이 2020년 12월 28일 답변
공과근성님이 2020년 12월 30일 채택됨
...