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

안드로이드 얼럿창 퍼미션체크처럼 사용못하나요?

0 추천
System.out.println("true 체크테스트");

        PreferenceManager.getDefaultSharedPreferences(this).edit().putBoolean("checked",true).apply();
        final boolean isChecked = PreferenceManager.getDefaultSharedPreferences(this).getBoolean("checked", false);

            if(isChecked){

                androidx.appcompat.app.AlertDialog.Builder alert = new androidx.appcompat.app.AlertDialog.Builder(MainActivity.this);
                alert.setPositiveButton("확인", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                        System.out.println("퍼미션 DIALOG_ID 체크테스트");
                        

                        dialog.dismiss();

                    }
                }).setNegativeButton("거부",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                Toast.makeText(MainActivity.this, "필수권한이 거부되어 앱을 종료합니다", Toast.LENGTH_SHORT).show();
                                finish();
                            }
                        });
                alert.setMessage("예이예이예");
                alert.show();
            }

 

처음 앱실행후 퍼미션체크처럼 한번만띄우고싶습니다.

얼럿창검색하면 버튼클릭시에 나오는것이나.. 체크박스부분같은경우는 리스트체크같은것만나와서 어떤식으로 검색해야할지 모르겟습니다.

메인창에 띄우기위해 protected void onCreate에 코드를 짜놧습니다.

 

해본것

1. 전역변수를 만들어서

if(cont == 0){

코드실행..

}

int cont = 0;

확인버튼 누를시 

int a= 0;

a++;

cont = a;

system.out.printIn("값이올랏나?"+cont); 이런식으로 로그에 1이라고 제대로 찍힙니다.

그런데 앱종료후 다시 실행하면 초기값을 0으로줘서 그런지 초기화되잇더라구요 ㅜㅜ

 

2. 트루펄스

is(isChecked[0] == true){

소스실행..

}

확인버튼 누를시isChecked[0] = false;

 

3. 체크박스

이건 체크박스자체가 안먹네요 ㅜㅜ

 

 

이렐리아v (160 포인트) 님이 2020년 10월 13일 질문
이렐리아v님이 2020년 10월 13일 태그 변경

1개의 답변

+1 추천
 
채택된 답변

우선 코드가 너무 읽기가 힘듦니다. 기능이 달라지면 별도로 메소드로 쪼개거나 코드가 커지면 별도의 클래스로 옮기시는게 모든 면에서 좋습니다. 대충 코드를 수정해 봤습니다. 

문제가 되는 부분이 사용자가 확인을 할 때 데이터를 preferences에 저장하는 부분이 없습니다. 이 부분을 추가해 주세요. 그리고 
preferences에 데이터를 읽고 쓰는 코드는 IO operation 이기 때문에 백그라운드 쓰레드에서 처리해 주시는게 퍼포먼스에 도움이 됩니다. 그리고 가능하면 뷰단이 아닌 곳에서 별도로 처리하도록 하시는 게 좋아요.

private final String USER_MENDATORY_KEY = "your_clear_key_name";
private final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);


private void checkUserMendatoryOption() {
       if (userMendatoryOptionConfigured()) return;

       showUserMendatoryOptionDialog(); 
}
 

private boolean userMendatoryOptionConfigured() {
     return preferences.getBoolean(USER_MENDATORY_KEY, false);
}
    

private void showUserMendatoryOptionDialog() {
      AlertDialog.Builder alert = new androidx.appcompat.app.AlertDialog.Builder(MainActivity.this);
      alert.setPositiveButton  { dialog, int which ->
            userMendatoryOptionAccepted()
       }
       .setNegativeButton("거부",
               dialog, int which ->  {
                        userMendatoryOptionDenied()
                }
      
      alert.setMessage("예이예이예");
      alert.show();

} 

private void userMendatoryOptionAccepted() {
    preferences.editor()
               .putBoolean(USER_MENDATORY_KEY, true)
}

private void userMendatoryOptionDenied() {
     Toast.makeText(MainActivity.this, "필수권한이 거부되어 앱을 종료합니다", Toast.LENGTH_SHORT).show();
                        finish();
}


//별도의 클래스
public class OnboardingOptionChecker {

     private final String USER_MENDATORY_KEY = "your_clear_key_name";
     private final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);

    
     public void validate(MendatoryOptionRequiredCallback callback) {

     } 
    
}

final OnboardingOptionChecker checker = new OnboardingOptionChecker();
checker.validate {
     showUserMendatoryOptionDialog();
}
spark (226,420 포인트) 님이 2020년 10월 13일 답변
이렐리아v님이 2020년 10월 14일 채택됨
자세하게 답변주셔서 감사합니다!
...