Я использую привязку данных и структуру MVVM.
<layout >
<data>
<variable
name="loginVM"
type="drish.com.dsfaallstars.login.viewmodel.LoginViewModel"/>
</data>
...
<Button
android:id="@+id/loginButton"
android:textStyle="bold"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:background="@drawable/button"
android:text="@{loginVM.buttonText}"
android:textColor="@android:color/white"
android:onClick="@{(view)->loginVM.loginProcess(view,username.getText().toString(),password.getText().toString())}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/guideline"
app:layout_constraintStart_toStartOf="@+id/guideline2"
app:layout_constraintTop_toBottomOf="@+id/textInputLayout3"
app:layout_constraintVertical_bias="0.19"/>
...
</layout>
В моей ViewModel я обрабатываю onClick, и в этом методе мне нужно показать окно оповещения в случае некоторых требований, для окна оповещения нужен контекст представления, а не контекст приложения.
Так что, пусть это будет так, или я должен следовать любому другому подходу, который будет более эффективным и полезным.
public void loginProcess(View v, String user, String pass) {
Log.e(LogConst.TAG, "loginProcess: ");
Log.e(LogConst.TAG, " username " + user + "======= password " + pass);
if (user.length() < 1 || pass.length() < 1) {
new CustomLoginDialog(user, pass, v.getContext());
} else if (checkCredentialsOffline(user, pass)) {
Log.e(LogConst.TAG, "loginProcess: Async ");
new LoginTaskAsync(v, user, pass).execute();
}
}