Android 로 딩 대화 상자 기능 및 인 스 턴 스 코드 불 러 오기(몰입 식 효 과 를 종료 하지 않 음)

사용자 정의 Dialog
몰입 식 효과 에서 인터페이스 가 대화 상 자 를 팝 업 할 때 대화 상 자 는 초점 을 얻 습 니 다.이 로 인해 인터페이스 가 몰입 식 효 과 를 종료 합 니 다.그러면 차단 대화 상 자 를 통 해 초점 을 얻어 몰입 식 을 종료 하지 않 는 목적 을 달성 할 수 있 습 니까?한다 면 한다.우선 개선 후의 효과 도 를 살 펴 보 자.

일반 대화 상자 팝 업 효과

Loading Dialog 팝 업 효과
사용자 정의 LoadingDialog

public class LoadingDialog extends Dialog {
  public LoadingDialog(Context context) {
    super(context);
  }
  public LoadingDialog(Context context, int theme) {
    super(context, theme);
  }
   @Override
  public void show() {
    // show          
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
    super.show();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
      int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
          | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
          | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
          | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
          | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
          | View.SYSTEM_UI_FLAG_FULLSCREEN;
      this.getWindow().getDecorView().setSystemUiVisibility(uiOptions);
    }
    // show            ,     dialog      
    this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
  }
}
위 를 통 해 알 수 있 듯 이 쇼 전에 window 의 FLAG 를 추 가 했 습 니 다.NOT_FOCUSABLE 속성,window 에서 초점 을 얻 지 못 하 게 합 니 다.show 이후 에 추 가 된 FLAG 를 제거 합 니 다.NOT_FOCUSABLE 속성 으로 필요 한 효 과 를 실현 합 니 다.
2.Window Manager 의 addView 방법 을 통 해 이 루어 집 니 다.

private WindowManager mwWindowManager;
private FrameLayout mForewarnLayout;
private boolean isShowing = false;
/**         */
public void alertLoadingDialog(){
  if (!isShowing){
    mForewarnLayout = (FrameLayout) LayoutInflater.from(getApplicationContext())
        .inflate(R.layout.view_loading, null, false);
    //   window    
    mwWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
    //       
    WindowManager.LayoutParams forewarnLayoutParams = new WindowManager.LayoutParams();
    forewarnLayoutParams.type = WindowManager.LayoutParams.TYPE_PHONE; //   window TYPE
    forewarnLayoutParams.format = PixelFormat.RGBA_8888; //       ,       
    //   Window flag
    forewarnLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
        | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
    forewarnLayoutParams.gravity = Gravity.LEFT | Gravity.TOP; //
    //           ,      
    //           
    forewarnLayoutParams.width = WindowManager.LayoutParams.MATCH_PARENT;
    forewarnLayoutParams.height = WindowManager.LayoutParams.MATCH_PARENT;
    // forewarnLayoutParams.windowAnimations = R.style.anim_view;//       
    //       
    mwWindowManager.addView(mForewarnLayout, forewarnLayoutParams);
    isShowing = true;
  }
}
/**         */
public void dismissTwo() {
  if (isShowing) {
    mwWindowManager.removeViewImmediate(mForewarnLayout);
    isShowing = false;
  }
}

addView 팝 업 효과
원 리 는 할 말 이 없고 직접 사용 하면 끝 입 니 다.주의해 야 할 것 은 addView 와 removeView 가 일일이 대응 해 야 한 다 는 것 입 니 다.상기 코드 는 이미 판단 처 리 를 했 습 니 다.권한 을 추가 해 야 합 니 다.그렇지 않 으 면 잘못 보고 할 수 있 습 니 다.

uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
여기 서 말씀 드 리 겠 습 니 다removeViewremoveViewImmediate의 차 이 는 두 가지 방법 으로 스 레 드 동기 화 문 제 를 설계 하 였 습 니 다.removeView Immediate()는 View 에 게 즉시 View 를 호출 하 라 고 알 리 는 것 입 니 다.onDetachWindow()는 이 방법 이 감청 이나 관찰자 로 이 루어 진 것 임 을 설명 합 니 다.스 레 드 의 동기 화 와 비동기 문제 로 인해 activity 가 소각 되 었 으 나 view 는 아직 remove 되 지 않 았 습 니 다.창문 이 새 어 나 갈 수 있 습 니 다.
총결산
위 에서 말 한 것 은 소 편 이 소개 한 안 드 로 이 드 로 딩 대화 상자 의 기능 과 인 스 턴 스 코드 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기