Android 프로 그래 밍 은 사용자 정의 입력 법 기능 예제[비밀 번 호 를 입력 할 때 제3자 가 훔 치 는 것 을 방지 합 니 다]를 실현 합 니 다.

이 사례 는 안 드 로 이 드 프로 그래 밍 이 사용자 정의 입력 법 기능 을 실현 하 는 것 을 보 여 준다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
안 드 로 이 드 사용자 에 게 는 일반적으로 제3자 의 입력 법 을 사용한다.그러나 비밀 번 호 를 입력 할 때(특히 지불 과 관련 된 비밀번호)제3자 입력 법 을 사용 하면 매우 큰 안전 위험 이 있다.현재 많은 인터넷 뱅 킹 류 의 앱 과 알 리 페 이 등 소프트웨어 는 사용자 가 비밀 번 호 를 입력 할 때 시스템 입력 법 을 직접 사용 하지 않 고 사용자 정의 입력 법 을 팝 업 한다.
간단 한 사용자 정의 입력 법 을 어떻게 실현 하 는 지 소개 한다.물론 Dialog 에 몇 십 개의 단 추 를 달 아 입력 할 수도 있 지만 프로 답지 못 하 다.
(1)우선 위의 효과 그림:
1.앞의 두 입력 상 자 는 사용자 정의 입력 법 을 사용 합 니 다.

2.세 번 째 입력 상 자 는 아무런 설정 도 하지 않 았 기 때문에 기본 입력 방법 을 사용 합 니 다.

(2)코드 소개:
1.홈 페이지 레이아웃 은 3 개의 입력 상자 에 android.inputmethodservice.KeyboardView 로 구성 되 어 있 습 니 다.android.inputmethodservice.KeyboardView 는 시스템 자체 가 가지 고 있 는 View 를 계승 하 는 구성 요소 이지 만 android.view 이 가방 아래 에 없 기 때문에 완전한 가방 이름 을 써 야 합 니 다.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
  <!--   EditText          -->
  <EditText
    android:id="@+id/input_password"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="8dp"
    android:hint="one password"
    android:layout_alignParentTop="true"
    android:inputType="textPassword" />
  <EditText
    android:id="@+id/input_password2"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/input_password"
    android:layout_margin="8dp"
    android:hint="another password"
    android:inputType="textPassword" />
  <!--  EditText        -->
  <EditText
    android:id="@+id/input_normal_text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/input_password2"
    android:layout_margin="8dp"
    android:hint="normal text" />
  <android.inputmethodservice.KeyboardView
    android:id="@+id/keyboardview"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:visibility="gone" />
</RelativeLayout>

2.KeyboardView 는 입력 법 을 표시 하 는 용기 컨트롤 로 사용 할 때 구체 적 인 입력 법 패 널 내용 을 설정 해 야 합 니 다.
(1)먼저 res 아래 xml 디 렉 터 리 를 새로 만 든 다음 파일 keyslayot.xml,즉 입력 패 널 의 내용 입 니 다.각 row 는 한 줄 을 표시 합 니 다.Keyboad 의 속성 key Width 와 key Height 는 각 버튼 의 크기 를 표시 합 니 다.25%p 는 부모 구성 요소 의 25%를 차지 합 니 다.Key 의 속성 codes 는 이 버튼 의 번호(클릭 시 시스템 리 셋 방법 에서 이 값 을 되 돌려 주 고 서로 다른 버튼 을 구분 합 니 다)를 표시 합 니 다.key Label 은 버튼 에 표 시 된 문 자 를 표시 합 니 다.또 다른 속성 이 많아 서 더 이상 진술 하지 않 습 니 다.

<?xml version="1.0" encoding="utf-8"?>
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
  android:keyWidth="25%p"
  android:keyHeight="10%p">
  <Row>
    <Key
      android:codes="55"
      android:keyLabel="7"
      android:keyEdgeFlags="left" />
    <Key
      android:codes="56"
      android:keyLabel="8" />
    <Key
      android:codes="57"
      android:keyLabel="9" />
    <!--           -->
    <Key
      android:codes="60001"
      android:keyLabel="DEL"
      android:isRepeatable="true" />
  </Row>
  <Row>
    <Key
      android:codes="52"
      android:keyLabel="4"
      android:keyEdgeFlags="left" />
    <Key
      android:codes="53"
      android:keyLabel="5" />
    <Key
      android:codes="54"
      android:keyLabel="6" />
    <Key
      android:codes="48"
      android:keyLabel="0" />
  </Row>
  <Row>
    <Key
      android:codes="49"
      android:keyLabel="1"
      android:keyEdgeFlags="left" />
    <Key
      android:codes="50"
      android:keyLabel="2" />
    <Key
      android:codes="51"
      android:keyLabel="3" />
    <Key
      android:codes="60002"
      android:keyLabel="Cancel" />
  </Row>
</Keyboard>

(2)사용 편 의 를 위해 새 클래스 를 만 듭 니 다:Keyboard Builder.자바,사용자 정의 입력 법 과 연결 EditText 를 초기 화 하 는 데 사 용 됩 니 다.코드 는 다음 과 같 습 니 다.

public class KeyboardBuilder {
  private static final String TAG = "KeyboardBuilder";
  private Activity mActivity;
  private KeyboardView mKeyboardView;
  public KeyboardBuilder(Activity ac, KeyboardView keyboardView, int keyBoardXmlResId) {
    mActivity = ac;
    mKeyboardView = keyboardView;
    Keyboard mKeyboard = new Keyboard(mActivity, keyBoardXmlResId);
    // Attach the keyboard to the view
    mKeyboardView.setKeyboard(mKeyboard);
    // Do not show the preview balloons
    mKeyboardView.setPreviewEnabled(false);
    KeyboardView.OnKeyboardActionListener keyboardListener = new KeyboardView.OnKeyboardActionListener() {
      @Override
      public void onKey(int primaryCode, int[] keyCodes) {
        // Get the EditText and its Editable
        View focusCurrent = mActivity.getWindow().getCurrentFocus();
        if (focusCurrent == null || !(focusCurrent instanceof EditText)) {
          return;
        }
        EditText edittext = (EditText) focusCurrent;
        Editable editable = edittext.getText();
        int start = edittext.getSelectionStart();
        // Handle key
        if (primaryCode == Constant.CodeCancel) {
          hideCustomKeyboard();
        } else if (primaryCode == Constant.CodeDelete) {
          if (editable != null && start > 0) {
            editable.delete(start - 1, start);
          }
        } else {
          // Insert character
          editable.insert(start, Character.toString((char) primaryCode));
        }
      }
      @Override
      public void onPress(int arg0) {
      }
      @Override
      public void onRelease(int primaryCode) {
      }
      @Override
      public void onText(CharSequence text) {
      }
      @Override
      public void swipeDown() {
      }
      @Override
      public void swipeLeft() {
      }
      @Override
      public void swipeRight() {
      }
      @Override
      public void swipeUp() {
      }
    };
    mKeyboardView.setOnKeyboardActionListener(keyboardListener);
  }
  //    EditText
  public void registerEditText(EditText editText) {
    // Make the custom keyboard appear
    editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
      @Override
      public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
          showCustomKeyboard(v);
        } else {
          hideCustomKeyboard();
        }
      }
    });
    editText.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        Log.d(TAG, "onClick");
        showCustomKeyboard(v);
      }
    });
    editText.setOnTouchListener(new View.OnTouchListener() {
      @Override
      public boolean onTouch(View v, MotionEvent event) {
        Log.d(TAG, "onTouch");
        EditText edittext = (EditText) v;
        int inType = edittext.getInputType();    // Backup the input type
        edittext.setInputType(InputType.TYPE_NULL); // Disable standard keyboard
        edittext.onTouchEvent(event);        // Call native handler
        edittext.setInputType(inType);       // Restore input type
        edittext.setSelection(edittext.getText().length());
        return true;
      }
    });
  }
  public void hideCustomKeyboard() {
    mKeyboardView.setVisibility(View.GONE);
    mKeyboardView.setEnabled(false);
  }
  public void showCustomKeyboard(View v) {
    mKeyboardView.setVisibility(View.VISIBLE);
    mKeyboardView.setEnabled(true);
    if (v != null) {
      ((InputMethodManager) mActivity.getSystemService(Activity.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(v.getWindowToken(), 0);
    }
  }
  public boolean isCustomKeyboardVisible() {
    return mKeyboardView.getVisibility() == View.VISIBLE;
  }
}

3.마지막 으로 메 인 Activity 의 코드 입 니 다.여 기 는 간단 합 니 다.

/**
 *         
 */
public class MainActivity extends ActionBarActivity {
  private KeyboardBuilder builder;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
    KeyboardView keyboardView = (KeyboardView) findViewById(R.id.keyboardview);
    builder = new KeyboardBuilder(this, keyboardView, R.xml.keys_layout);
    EditText editText = (EditText) findViewById(R.id.input_password);
    builder.registerEditText(editText);
    EditText editText2 = (EditText) findViewById(R.id.input_password2);
    builder.registerEditText(editText2);
  }
  @Override
  public void onBackPressed() {
    if (builder != null && builder.isCustomKeyboardVisible()) {
      builder.hideCustomKeyboard();
    } else {
      this.finish();
    }
  }
}

더 많은 안 드 로 이 드 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.,,,,,,,
본 고 에서 말 한 것 이 여러분 의 안 드 로 이 드 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기