Как закрыть диалоговое окно при работе с фрагментом? - PullRequest
0 голосов
/ 03 октября 2019

У меня есть ссылка на диалог оповещения, которую я хочу отклонить. У меня проблема в том, что я не могу просто удалить ссылку на нее из моего диалога, вот код из моего фрагмента, чтобы вы могли понять, почему -


@OnClick(R.id.verification_button_got_it)
    void onBtnGotItClicked(View view) {
        if (!checkBoxAge.isChecked()) {
            checkBoxAge.setTextColor(ContextCompat.getColor(checkBoxAge.getContext(), R.color.accent_red));
            return;
        }
        showProgressDialog();
        if (getContext() instanceof VerificationPageListener) {
            ((VerificationPageListener) getContext()).onPageAgreed();
        }
    }

private void showProgressDialog(){
        if (mBuilder == null) {
            mBuilder = new AlertDialog.Builder(App.getAppContext());
        }
        mBuilder.setCancelable(false);
        mBuilder.setView(R.layout.custom_proggress_dialog);
        mDialog = mBuilder.create();
        mDialog.show();
    }

В тот момент, когда вы видите "onPageAgreed() "- это точка, в которой данные отправляются на сервер для проверки IMEI устройства с целью проверки, поэтому, если я закрываю диалоговое окно в этой точке, диалоговое окно вообще не будет отображаться, потому что оно будет немедленным.

Как я уже сказал, это фрагмент, который находится поверх действия, поэтому действие обрабатывает всю проверку через базу данных. Вот код действия, обрабатывающего базу данных, проверяющего и перемещающего результаты в докладчик -


@Override
  public void onPageAgreed() {
    // current page is accepted, move to next
    int cur = viewPager.getCurrentItem();
    if (cur == adapter.getCount() - 1) {
      // ask for permission
      requestPhoneState();
    } else {
      // move to next
      viewPager.setCurrentItem(cur + 1, true);
    }
  }

  private void requestPhoneState() {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)
        != PackageManager.PERMISSION_GRANTED) {
      ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, RC_PERMISSION_READ_STATE);
    } else {
      // retrieve IMEI
      accessDeviceIdAndVerifyDB(this);
    }
  }

  @Override
  protected void onRequestPermissionsResultPostResume(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResultPostResume(requestCode, permissions, grantResults);
    if (requestCode == RC_PERMISSION_READ_STATE
        && permissions.length > 0 && StringUtils.equals(permissions[0], Manifest.permission.READ_PHONE_STATE)
        && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
      // granted, read IMEI
      accessDeviceIdAndVerifyDB(this);
    } else {
      // failed
      onErrorDeviceIdNotGrantedPermission();
    }
  }

  private void accessDeviceIdAndVerifyDB(Activity activity) {
    if (ActivityCompat.checkSelfPermission(activity, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
      TelephonyManager telephonyManager = (TelephonyManager) activity.getSystemService(Context.TELEPHONY_SERVICE);
      if (telephonyManager != null) {
        @SuppressLint("HardwareIds") String deviceId = telephonyManager.getDeviceId();
        if (StringUtils.isNotBlank(deviceId)) {
          checkDeviceIdWithDB(deviceId);
        }
      }
    }
  }

  private void checkDeviceIdWithDB(String deviceId) {
    presenter.onDeviceIdReceived(deviceId);
  }


Кажется, что я застрял в цикле, где мне нужно переместить ссылку на мой диалог по всейнесколько классов только для того, чтобы отменить его, который кажется действительно сломанным. Как мне проще отменить мой диалог?

edit -

Я добавил этот код до того, как завершается действие -

@Override
  public void sendDeviceIdResult(String deviceId, boolean isAlreadyExist) {

    int currentItem = viewPager.getCurrentItem();
    Fragment item = adapter.getItem(currentItem);
    if (item instanceof PhoneStateAndAgeVerificationFragment) {
      Dialog dialog = ((PhoneStateAndAgeVerificationFragment) item).getProgressDialog();
      if (dialog != null && dialog.isShowing()) {
        dialog.dismiss();
      }
    }

    Intent intent = new Intent();
    intent.putExtra(KEY_DEVICE_ID, deviceId);
    intent.putExtra(KEY_IS_SUCCESS, !isAlreadyExist);
    setResult(RESULT_OK, intent);
    finish();


  }

, но на этомУкажите, что мой диалог всегда нулевой, и я не могу понять, будет ли он в этом случае всегда нулевым, а проверка избыточна или я делаю что-то не так?

1 Ответ

1 голос
/ 03 октября 2019

Вы можете закрыть свой dialog, который находится в вашем frament от вашего activity, используя интерфейсы.

В действии создайте интерфейс, подобный следующему.

public class YourActivity extends AppCompactActivity{

  public interface onSomeEventListener {
    public void closeDialog();
  }

  onSomeEventListener someEventListener;
  //.............

@Override
  public void onPageAgreed() {
    // current page is accepted, move to next
    int cur = viewPager.getCurrentItem();
    if (cur == adapter.getCount() - 1) {
      // ask for permission
      requestPhoneState();
    } else {
      // move to next
      viewPager.setCurrentItem(cur + 1, true);
    }

   //you can add below line in your activity from where you can close your dialog. 
   someEventListener.closeDialog();
  }

В вашемfragment Вы должны реализовать этот интерфейс, как показано ниже

public class YourFragment extends Fragment implements onSomeEventListener{

  @Override
  public void closeDialog() {
      // here you can close your dialog
      if (mDialog != null && mDialog.isShowing()) {
        mDialog.dismiss();
      }
  }
}

ОБНОВЛЕНИЕ

В вашем sendDeviceIdResult() вы можете упростить код, используя приведенный выше интерфейс, как показано ниже.

@Override
  public void sendDeviceIdResult(String deviceId, boolean isAlreadyExist) {

    int currentItem = viewPager.getCurrentItem();
    Fragment item = adapter.getItem(currentItem);
    if (item instanceof PhoneStateAndAgeVerificationFragment) {
       someEventListener = item; // initialize your interface here instead of onCreate()
       someEventListener.closeDialog(); 
    }

    Intent intent = new Intent();
    intent.putExtra(KEY_DEVICE_ID, deviceId);
    intent.putExtra(KEY_IS_SUCCESS, !isAlreadyExist);
    setResult(RESULT_OK, intent);
    finish();


  }

...