Android에서 암호 입력 내용 표시 전환

오늘 프로젝트를 할 때 비밀번호 입력 상자의 가시적 전환에 관한 문제를 만났습니다. 인터넷에 검색해 봤는데 이 안의 문턱이 아직 작지 않으니 기록을 하나 하세요. 다음에 만나면 해결하기 쉬워요.
먼저 간단한 테스트 프로젝트를 썼다.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
	<EditText 
	    android:id="@+id/pwd_edit"
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content"
	    android:inputType="textPassword"/>
	<Button
	    android:id="@+id/pwd_switch"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:text="  "/>
</LinearLayout>
package com.example.helloword;

import android.app.Activity;
import android.os.Bundle;
import android.text.InputType;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity {
	EditText pwdEdit;
	boolean flag = false;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		pwdEdit = (EditText) findViewById(R.id.pwd_edit);
		Button pwdSwitch = (Button) findViewById(R.id.pwd_switch);
		pwdSwitch.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				if(flag){
					pwdEdit.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
					flag = false;
				}else{
					pwdEdit.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
					flag = true;
				}
			}
		});
	}

}

그 결과 이런 방법은 안 되고 비밀번호가 표시되면 더 이상 숨길 수 없다는 것을 발견했다.
그래서 찾아보니 다음과 같은 방법이 있었다.
package com.example.helloword;

import android.app.Activity;
import android.os.Bundle;
import android.text.method.HideReturnsTransformationMethod;
import android.text.method.PasswordTransformationMethod;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity {
	EditText pwdEdit;
	boolean flag = false;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		pwdEdit = (EditText) findViewById(R.id.pwd_edit);
		Button pwdSwitch = (Button) findViewById(R.id.pwd_switch);
		pwdSwitch.setOnClickListener(new OnClickListener() {    
            @Override    
            public void onClick(View v) {    
                if (!flag) {    
                    pwdEdit.setTransformationMethod(HideReturnsTransformationMethod.getInstance());    
                } else {    
                    pwdEdit.setTransformationMethod(PasswordTransformationMethod.getInstance());    
                }    
                flag = !flag;    
                pwdEdit.postInvalidate(); 
            }    
        });    
	}

}

이렇게 하면 되지만 커서가 전환될 때마다 행 맨 위로 돌아가고 수정된 코드는 다음과 같습니다.
package com.example.helloword;

import android.app.Activity;
import android.os.Bundle;
import android.text.Selection;
import android.text.Spannable;
import android.text.method.HideReturnsTransformationMethod;
import android.text.method.PasswordTransformationMethod;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity {
	EditText pwdEdit;
	boolean flag = false;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		pwdEdit = (EditText) findViewById(R.id.pwd_edit);
		Button pwdSwitch = (Button) findViewById(R.id.pwd_switch);
		pwdSwitch.setOnClickListener(new OnClickListener() {    
            @Override    
            public void onClick(View v) {    
                if (!flag) {    
                    pwdEdit.setTransformationMethod(HideReturnsTransformationMethod.getInstance());    
                } else {    
                    pwdEdit.setTransformationMethod(PasswordTransformationMethod.getInstance());    
                }    
                flag = !flag;    
                pwdEdit.postInvalidate(); 
                CharSequence text = pwdEdit.getText();
                if (text instanceof Spannable) {
                    Spannable spanText = (Spannable)text;
                    Selection.setSelection(spanText, text.length());
                }
            }    
        });    
	}

}

완벽하게 해결되었지만 이 Hide Return Transformation Method와Password Transformation Method가 낯설어서 인터넷에 검색해 보니 이 종류는 입력 문자의 표시를 바꾸는 도구류에 해당한다는 것을 발견했다.그러나
setTransformationMethod는 입력한 문자를 변환할 수 있습니다. 자신의 변환이 필요하다면 TransformationMethod 인터페이스를 통해 목적을 달성할 수 있습니다. (예를 들어 입력한 모든 문자를 a로 바꾸거나 a를 입력하면 z를 표시하고 z를 입력하면 a를 표시합니다.)
여기에는 단지 기록일 뿐입니다. 더 좋은 방법이 있다면 인색하지 마십시오^ ^

좋은 웹페이지 즐겨찾기