programing

NumberPicker에서 소프트 키보드 사용

muds 2023. 8. 4. 23:21
반응형

NumberPicker에서 소프트 키보드 사용

미적인 이유로 숫자 값을 입력하기 위해 숫자 선택기를 사용할 때 소프트 키보드를 비활성화하려고 합니다.다음은 내 레이아웃-xml-코드입니다.

<?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="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:id="@+id/linearLayout2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginBottom="30dp"
        android:layout_marginTop="30dp" >

        <NumberPicker
            android:id="@+id/repetitionPicker"
            android:layout_width="40dp"
            android:layout_height="wrap_content" />

        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:text="@string/repetitions_short_divider"
            android:textAppearance="?android:attr/textAppearanceMedium" />

        <NumberPicker
            android:id="@+id/weightPicker"
            android:layout_width="40dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="40dp" />

        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:text="@string/pounds"
            android:textAppearance="?android:attr/textAppearanceMedium" />
    </LinearLayout>


    <Button
        android:id="@+id/saveButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="@string/save" />

</LinearLayout>

마지막으로 onCreate() 메서드에서 키보드를 차단하려는 코드는 다음과 같습니다.

// hide keyboard
View.OnClickListener disableKeyBoardListener = new View.OnClickListener() {
    public void onClick(View v) {
        ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE))
                .hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }
};

((EditText) weightPicker.getChildAt(1)).setInputType(InputType.TYPE_NULL);
((EditText) repetitionPicker.getChildAt(1)).setInputType(InputType.TYPE_NULL);

((EditText) weightPicker.getChildAt(1)).setOnClickListener(disableKeyBoardListener);
//((EditText) repetitionPicker.getChildAt(1)).setOnClickListener(disableKeyBoardListener);
//weightPicker.setOnClickListener(disableKeyBoardListener);
//repetitionPicker.setOnClickListener(disableKeyBoardListener);     

getWindow().setSoftInputMode(
        WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 

안타깝게도 숫자 선택기를 클릭해도 소프트 키보드가 계속 표시됩니다.아이디어 있어요?

방금 이것을 찾았고 그것은 매력적으로 작동합니다.

myNumberPicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);

XML로 설정할 수도 있습니다.

android:descendantFocusability="blocksDescendants" 

앤드류 웨버의 답변을 XML 버전으로 작성했습니다.

android:descendantFocusability="blocksDescendants"

<NumberPicker
        android:id="@+id/your_numberpicker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:descendantFocusability="blocksDescendants"/>

com/android/internal/widget/NumberPicker.java 소스 코드를 읽은 후 다음 솔루션을 찾았습니다.

// Hide soft keyboard on NumberPickers by overwriting the OnFocusChangeListener
OnFocusChangeListener fcl = new OnFocusChangeListener() {
    public void onFocusChange(View v, boolean hasFocus) {
        // Do nothing to suppress keyboard
    }
};

((EditText) numberPicker.getChildAt(1)).setOnFocusChangeListener(fcl);

// Suppress soft keyboard from the beginning
((EditText) numberPicker.getChildAt(1)).setInputType(InputType.TYPE_NULL);

방금 @MaxVogler의 ans를 향상시켰고(그래서 만약 이 투표도 @MaxVogler에게 투표하고 싶지 않다면) 강력한 해킹을 만들었습니다.또한 우리는 전화할 필요가 없습니다.setOnFocusChangeListener그리고.setInputType.오직.setFocusable고의로

아래는 이 기능을 활성화/비활성화하는 도우미 API입니다.

public static void enableNumberPickerManualEditing(NumberPicker numPicker,
        boolean enable) {
    int childCount = numPicker.getChildCount();

    for (int i = 0; i < childCount; i++) {
        View childView = numPicker.getChildAt(i);

        if (childView instanceof EditText) {
            EditText et = (EditText) childView;
            et.setFocusable(enable);
            return;
        }
    }
}

사용자가 원하는 경우 숫자를 편집할 수 있도록 하는 또 다른 방법이 있습니다. 처음에는 소프트 키보드를 사용하지 않습니다.위의 답변에 따라 인터페이스가 처음 표시될 때 소프트 키보드를 누르는 데 사용합니다.그런 다음 구현할 대화 상자 또는 활동을 가져옵니다.View.OnTouchListener,불러setOnTouchListener(this)당신의NumberPicker그리고 당신이 구현할 때.onTouch(View v,MotionEvent e)숫자 선택기 하위 초점성을 정상 값으로 재설정한 다음 false를 반환합니다.

false를 반환한다는 것은 터치가 여전히 NumberPicker에 의해 처리된다는 것을 의미합니다. 즉, 사용자가 편집 상자를 누르면 소프트 키보드가 나타납니다.이것이 바로 제가 동일한 문제에 직면하고 싶었던 바로 그 문제입니다. 소프트 키보드가 처음 표시될 때 대화 상자를 표시하는 것은 표시된 후 대화 상자가 위로 이동하기 때문에 불쾌합니다.

public class GetBufferDialog extends DialogFragment implements View.OnTouchListener {

메소드에서 Dialog(대화 상자)를 만들고 NumberPicker(번호 선택기)를 찾은 후:

m_oldFocus = m_numberpicker.getDescendantFocusability();
m_numberpicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS); 
m_numberpicker.setOnTouchListener(this);

OnTouch 방법은 다음과 같습니다.

public boolean onTouch(View v, MotionEvent event) {
    m_numberpicker.setDescendantFocusability(m_oldFocus);
    return false;
}

프로그래밍 방식으로 작동하는 코드:

mp.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);

XML:

android:descendantFocusability="blocksDescendants" 

작동하는 이유는 모르겠지만 키보드 표시를 방해하지 않는 OnClickListener 설정(롤리팝)

numberPicker.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View view) {
  }
});

제가 일하는 가장 간단한 방법은:

numberPicker               = (NumberPicker) myDialogView.findViewById(R.id.myViewId);
EditText numberPickerChild = (EditText) numberPicker.getChildAt(0);
numberPickerChild.setFocusable(false);
numberPickerChild.setInputType(InputType.TYPE_NULL);

숫자 선택기로 보기를 로드할 때 소프트웨어 키보드만 숨기려고 하지만 보기가 로드된 후에도 사용자가 편집할 수 있도록 하려면 하위 초점 기능을 차단하지 않아야 합니다.대신 숫자 선택기가 보기의 첫 번째 초점 항목이 되지 않도록 합니다.

자세한 내용은 이 답변을 참조하십시오.

위의 답변에 기초하여:

    <!-- Dummy item to prevent Number Picker from receiving focus -->
    <LinearLayout        
        android:focusable="true" 
        android:focusableInTouchMode="true"
        android:layout_width="0px" 
        android:layout_height="0px"/>

    <!-- :nextFocusUp and :nextFocusLeft have been set to the id of this component 
         to prevent the dummy from receiving focus again -->
    <NumberPicker 
        android:id="@+id/number_picker"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:nextFocusUp="@id/number_picker" 
        android:nextFocusLeft="@id/number_picker"/>
/**
 * set focus to top level window
 * disposes descendant focus
 * disposes softInput
 * @param context - activity context
 * @param enable - state of focus
 * */
public static void topLevelFocus(Context context, boolean enable){
    if(Activity.class.isAssignableFrom(context.getClass())){
        ViewGroup tlView = (ViewGroup) ((Activity) context).getWindow().getDecorView();
        if(tlView!=null){
            tlView.setFocusable(enable);
            tlView.setFocusableInTouchMode(enable);
            tlView.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
            tlView.requestFocus();
        }
    }
}

호출:

  • 하위 초점성을 차단하지 않습니다(숫자 선택기는 편집 가능).

  • 생성 시 소프트 입력을 숨깁니다.

  • 입력을 처리하기 전에 getValue()에서 올바른 walue를 가져올 수 있습니다.


이 확장자는 실행 방법을 잊지 않고 읽을 수 있는 코드가 있는 것이 좋습니다.구현 세부 정보를 숨기는 것은 아니지만, 이 경우에는 허용 가능하다고 생각합니다.

fun NumberPicker.disableTextEditing(disable: Boolean) {
    descendantFocusability = if (disable) FOCUS_BLOCK_DESCENDANTS else FOCUS_BEFORE_DESCENDANTS
}

언급URL : https://stackoverflow.com/questions/8854781/disable-soft-keyboard-on-numberpicker

반응형