Estou tentando desativar o teclado virtual ao usar um NumberPicker para inserir valores numéricos (por razões estéticas). Este é o meu layout-xml-code:
<?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>
E, finalmente, este é o código em que tento bloquear o teclado no método 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);
Infelizmente, o teclado virtual ainda aparece ao clicar em um NumberPicker. Alguma ideia?
Versão XML da resposta de Andrew Webber
Exemplo
fonte
Depois de ler o código-fonte com / android / internal / widget / NumberPicker.java, cheguei à seguinte solução:
fonte
Apenas aprimorei os ans do @MaxVogler (por isso, se não quisermos votar neste voto também no @MaxVogler) e faça dele um hack robusto. Também não precisamos ligar
setOnFocusChangeListener
esetInputType
. ApenassetFocusable
falso irá fazer.Abaixo está uma API auxiliar para ativar / desativar o recurso
fonte
Aqui está outra maneira de fazer isso, que permite ao usuário editar um número, se quiser - apenas suprime o teclado virtual inicialmente. Use
NumberPicker.setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS)
para suprimir o teclado virtual quando a interface aparecer pela primeira vez, conforme as respostas acima. Em seguida, instale seu diálogo ou atividadeView.OnTouchListener
, chamesetOnTouchListener(this)
seuNumberPicker
e, em sua implementação,onTouch(View v,MotionEvent e)
redefina a focalização descendente do numberpicker para seu valor normal e, em seguida, retorne false.Retornar false significa que o toque ainda é processado pelo NumberPicker, o que significa que, se o usuário tocar na caixa de edição, o teclado virtual será ativado. Isso é exatamente o que eu queria enfrentar o mesmo problema - ter o teclado virtual com a caixa de diálogo quando é exibida pela primeira vez é desagradável, pois muda a caixa de diálogo depois que aparece.
depois de criar o Diálogo no
onCreateDialog()
método e encontrar o NumberPicker:e aqui está o método OnTouch:
fonte
O mais simples que encontrei para trabalhar foi:
fonte
Se você deseja apenas ocultar o teclado do software ao carregar a visualização com o seletor de números, mas ainda assim deseja que os usuários possam editar depois que a visualização é carregada, não deve bloquear a focagem descendente. Em vez disso, evite que o seletor de números seja o primeiro item focado em sua exibição.
Veja esta resposta para detalhes.
Com base na resposta acima:
fonte
Não sei por que ele funciona, mas definir OnClickListener que não faz nada impede que o teclado seja exibido (pirulito)
fonte
* chamando isso:
não bloqueia a focabilidade descendente (numberpicker será editável)
ocultará a entrada suave ao criar
antes (entrada de processamento), getValue () permitirá obter o valor adequado
fonte
Código de trabalho programaticamente:
XML:
fonte