안드로이드 스튜디오에서 sharedpreference를 이용하여 로그인 연습중인대 문제가 생겼습니다. 도움 부탁드립니다.

조회수 1289회

회원가입 액티비티 로그인 액티비티 로그인 결과 액티비티 3개로 나누어서 로그인 결과 액티비티에서 로그인 값을 확인하여 회원정보가 맞으면 다음 액티비티로 넘어가고 로그인 값이 존재하지 않는다면 버튼을 누를수 없게 만들고 있는대 로그인 결과는 맞게 출력이 되지만 버튼이 항상 눌립니다. 조언좀 부탁드립니다.

//회원가입 액티비티 
ok.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(RegisterActivity.this, "회원가입이 완료되었습니다.", Toast.LENGTH_SHORT).show();

                SharedPreferences preferences = getSharedPreferences("MYPREFS", Context.MODE_WORLD_READABLE);

                String newUser = user.getText().toString();
                String newPassword = pass.getText().toString();
                String newEmail = email.getText().toString();

                SharedPreferences.Editor editor = preferences.edit();
                editor.putString("newEmail", newEmail);
                editor.commit();
                editor.putString("newPassword", newPassword);
                editor.commit();
                editor.putString(newEmail + newPassword + "data", newUser + " 님 환영합니다" + "\n" + newEmail);
                editor.commit();

                Intent intent = new Intent(RegisterActivity.this, MainActivity.class);

                startActivity(intent);
            }
        });

//로그인 액티비티
login.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {
                String login_email = email.getText().toString();
                String password = pass.getText().toString();
                SharedPreferences preferences = getSharedPreferences("MYPREFS", MODE_PRIVATE);

                String userDetails = preferences.getString(login_email + password + "data", "존재하지 않는 회원입니다.");
                SharedPreferences.Editor editor = preferences.edit();
                editor.putString("display", userDetails);
                editor.commit();

                Intent displayScreen = new Intent(MainActivity.this, DisplayScreen.class);
                displayScreen.putExtra("elogin",login_email);
                displayScreen.putExtra("epass",password);
                startActivity(displayScreen);
            }
        });

//로그인결과액티비티
final Button ok = (Button) findViewById(R.id.button_ok);

        SharedPreferences preferences = getSharedPreferences("MYPREFS", Context.MODE_WORLD_READABLE);
        String id = preferences.getString("newEmail","");
        String ps = preferences.getString("newPassword","");
        String display = preferences.getString("display", "1");

        TextView displayInfo = (TextView) findViewById(R.id.textViewName);
        displayInfo.setText(display);

        if (display.equals("1")) {
            ok.setClickable(false);

        } else  {
            ok.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(DisplayScreen.this, AppActivity.class);
                    startActivity(intent);
                }
            });
        }

  • 도움이 될지는 모르겠지만, button.setEnabled(false); 를 사용하여 버튼을 사용하지 못하게 만드는건 어떨까요? 심승현 2018.11.17 00:57

1 답변

  • 올려주신 코드가 모두 어느 시점에 호출되는지 판단할수 없지만 일단, if (display.equals("1")) 여기에서 display가 1로 제대로 나오고 있는지를 먼저 확인하셔야 할것 같아요. if (display.equals("1"))이 구문이 true이고 setClickable(false)구문을 탔는데도 클릭이 되는것이라면 다른곳에서 setOnClickListener를 등록한것은 아닌지 확인해보세요.

    참고로 setOnClickListener는 클릭리스너 달기 이전에 setClickable(false);하고 클릭리스너를 달면 clickable은 다시 true가 됩니다.

    안드로이드 내부 코드를 보시면 아래처럼 되어있거든요.

    public void setOnClickListener(@Nullable OnClickListener l) {
            if (!isClickable()) {
                setClickable(true);
            }
            getListenerInfo().mOnClickListener = l;
        }
    

    그래서 클릭을 막는걸 하려면 setClickable(false)보다는 setEnabled(false)를 더 권장합니다. 확실하게 막기 위해서요.

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)