Android 위 챗 사용자 정의 디지털 키보드 구현 코드

본 고 는 안 드 로 이 드 가 위 챗 을 모방 하여 디지털 키보드 의 실현 코드 를 소개 하 였 으 며,여러분 에 게 도움 이 되 기 를 바 랍 니 다.
최종 효과:

이 사용자 정의 키 보드 를 실현 하 는 사고방식 은 매우 간단 하 다.
  • 디지털 키보드 의 레이아웃 을 작성 해 야 합 니 다
  • Edittext 와 결합 하여 사용 하고 모든 버튼 의 클릭 사건 을 처리 합 니 다
  • 시스템 소프트 키 보드 를 사용 하지 않 습 니 다생각 이 있 으 면 실현 하기 가 어렵 지 않다.
    1.키보드 의 xml 레이아웃 구현
    격자 스타일 의 레이아웃 은 GridView 나 RecyclerView 로 모두 실현 할 수 있 습 니 다.그 실 용적 인 GridView 가 더욱 편리 하지만 저 는 RecyclerView 의 용법 을 많이 익히 기 위해 RecyclerView 를 선 택 했 습 니 다.
    
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:orientation="vertical">
    
      <View
        android:layout_width="match_parent"
        android:layout_height="2px"
        android:background="@color/btn_gray"/>
    
      <RelativeLayout
        android:id="@+id/rl_back"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/iv_back_bg"
        android:padding="10dp">
    
        <ImageView
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_centerInParent="true"
          android:src="@mipmap/keyboard_back"/>
      </RelativeLayout>
    
      <View
        android:layout_width="match_parent"
        android:layout_height="1px"
        android:background="@color/btn_gray"/>
    
      <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/keyboard_bg"
        android:overScrollMode="never"></android.support.v7.widget.RecyclerView>
    
    </LinearLayout>
    
    
    RecyclerView 는 키보드 레이아웃 을 실현 하 는 데 사용 되 며,위의 RelativeLayout 는 키보드 의 클릭 이 벤트 를 접 기 위 한 것 입 니 다.
    2.코드 에서 키보드 레이아웃 을 실현 하고 데 이 터 를 채 우 며 클릭 이벤트 추가
    새 종류의 KeyboardView 는 RelativeLayout 에서 계승 하여 위의 레이아웃 파일 과 연결 한 다음 에 초기 화 작업 을 합 니 다.RecyclerView 에 데 이 터 를 채 우 고 어댑터 를 설정 하 며 나타 나 고 사라 지 는 애니메이션 효 과 를 설정 하고 사용 할 수 있 는 방법 을 쓰 는 등 입 니 다.
    
    public class KeyboardView extends RelativeLayout {
    
      private RelativeLayout rlBack;
      private RecyclerView recyclerView;
      private List<String> datas;
      private KeyboardAdapter adapter;
      private Animation animationIn;
      private Animation animationOut;
    
    
      public KeyboardView(Context context) {
        this(context, null);
      }
    
      public KeyboardView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
      }
    
      public KeyboardView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context, attrs, defStyleAttr);
      }
    
      private void init(Context context, AttributeSet attrs, int defStyleAttr) {
        LayoutInflater.from(context).inflate(R.layout.layout_key_board, this);
        rlBack = findViewById(R.id.rl_back);
        rlBack.setOnClickListener(new OnClickListener() {
          @Override
          public void onClick(View view) { //       
            dismiss();
          }
        });
        recyclerView = findViewById(R.id.recycler_view);
    
        initData();
        initView();
        initAnimation();
      }
    
      //     
      private void initData() {
        datas = new ArrayList<>();
        for (int i = 0; i < 12; i++) {
          if (i < 9) {
            datas.add(String.valueOf(i + 1));
          } else if (i == 9) {
            datas.add(".");
          } else if (i == 10) {
            datas.add("0");
          } else {
            datas.add("");
          }
        }
      }
    
      //      
      private void initView() {
        recyclerView.setLayoutManager(new GridLayoutManager(getContext(), 3));
        adapter = new KeyboardAdapter(getContext(), datas);
        recyclerView.setAdapter(adapter);
      }
    
      //        
      private void initAnimation() {
        animationIn = AnimationUtils.loadAnimation(getContext(), R.anim.keyboard_in);
        animationOut = AnimationUtils.loadAnimation(getContext(), R.anim.keyboard_out);
      }
    
      //      
      public void show() {
        startAnimation(animationIn);
        setVisibility(VISIBLE);
      }
    
      //      
      public void dismiss() {
        if (isVisible()) {
          startAnimation(animationOut);
          setVisibility(GONE);
        }
      }
    
      //         
      public boolean isVisible() {
        if (getVisibility() == VISIBLE) {
          return true;
        }
        return false;
      }
    
      public void setOnKeyBoardClickListener(KeyboardAdapter.OnKeyboardClickListener listener) {
        adapter.setOnKeyboardClickListener(listener);
      }
    
      public List<String> getDatas() {
        return datas;
      }
    
      public RelativeLayout getRlBack() {
        return rlBack;
      }
    }
    
    
    Adapter 안 에는 간단 한 코드 가 들 어 있 습 니 다.여 기 는 붙 이지 않 습 니 다.글 끝 에 원본 다운로드 주 소 를 드 리 겠 습 니 다.
    지금까지 사용자 정의 디지털 키 보드 는 기본적으로 다 쓴 셈 이지 만 가장 중요 한 것 은 Edittext 와 결합 해서 사용 해 야 한다.
    3.Edittext 와 결합 해서 사용
    1.시스템 소프트 키보드 사용 안 함
    
    if (Build.VERSION.SDK_INT <= 10) {
       etInput.setInputType(InputType.TYPE_NULL);
    } else {
       getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
       try {
         Class<EditText> cls = EditText.class;
         Method setShowSoftInputOnFocus = cls.getMethod("setShowSoftInputOnFocus", boolean.class);
         setShowSoftInputOnFocus.setAccessible(true);
         setShowSoftInputOnFocus.invoke(etInput, false);
       } catch (Exception e) {
         e.printStackTrace();
       }
    }
    
    인터넷 에서 방법 을 찾 았 지만 Edittext 를 눌 렀 을 때 시스템 소프트 키 보드 는 여전히 팝 업 된다.마지막 으로 이 방법 을 찾 았 다.반사 로 소프트 키 보드 를 강제로 꺼 내지 않 으 면 효과 가 좋다.
    2.각 버튼 의 클릭 이벤트 처리
    
      @Override
      public void onKeyClick(View view, RecyclerView.ViewHolder holder, int position) {
        switch (position) {
          case 9: //      
            String num = etInput.getText().toString().trim();
            if (!num.contains(datas.get(position))) {
              num += datas.get(position);
              etInput.setText(num);
              etInput.setSelection(etInput.getText().length());
            }
            break;
          default: //      
            if ("0".equals(etInput.getText().toString().trim())) { //        0  ,           
              break;
            }
            etInput.setText(etInput.getText().toString().trim() + datas.get(position));
            etInput.setSelection(etInput.getText().length());
            break;
        }
      }
    
      @Override
      public void onDeleteClick(View view, RecyclerView.ViewHolder holder, int position) {
        //       
        String num = etInput.getText().toString().trim();
        if (num.length() > 0) {
          etInput.setText(num.substring(0, num.length() - 1));
          etInput.setSelection(etInput.getText().length());
        }
      }
    
    
    논리 도 매우 간단 해서 코드 를 보면 알 수 있다.최종 효 과 는 첫 번 째 그림 의 모습 이다.
    이 키 보드 는 간단 하 다.나중에 위 챗 이나 알 리 페 이 를 모방 한 결제 비밀번호 입력 레이아웃 을 쓸 계획 이다.
    ->->->클릭 하여 원본 다운로드<-<-<-
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기