NumberPickerを使用して数値を入力するときに、ソフトキーボードを無効にしようとしています(審美的な理由から)。これは私の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>
そして最後に、これは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);
悲しいことに、NumberPickerをクリックすると、ソフトキーボードが表示されたままになります。何か案は?
ちょうどこれを見つけて、それは魅力のように機能します:
myNumberPicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);
これをXMLで設定することもできます。
Android:descendantFocusability="blocksDescendants"
Andrew Webberの回答の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
to falseのみが実行されます。
以下は、機能を有効/無効にするヘルパー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;
}
}
}
ユーザーが必要に応じて番号を編集できるようにする別の方法を次に示します。最初はソフトキーボードを非表示にするだけです。 NumberPicker.setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS)
を使用して、上記の回答に従ってインターフェイスが最初に表示されるときにソフトキーボードを非表示にします。次に、ダイアログまたはアクティビティを取得してView.OnTouchListener
を実装し、NumberPicker
でsetOnTouchListener(this)
を呼び出します。また、onTouch(View v,MotionEvent e)
の実装で、numberpickerの子孫フォーカス可能性を通常の値にリセットし、falseを返します。
Falseを返すということは、タッチが引き続きNumberPickerによって処理されることを意味します。つまり、ユーザーが編集ボックスをタップすると、ソフトキーボードが表示されます。これは、私が同じ問題に直面したかったのとまったく同じです。最初に表示されるときにソフトキーボードがダイアログを表示するのは、ダイアログが表示された後に上に移動するので不快です。
public class GetBufferDialog extends DialogFragment implements View.OnTouchListener {
onCreateDialog()
メソッドでダイアログを作成し、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;
}
ナンバーピッカーでビューを読み込むときにソフトウェアキーボードのみを非表示にし、ビューの読み込み後にユーザーが編集できるようにする場合は、子孫のフォーカス機能をブロックしないでください。代わりに、番号ピッカーがビューの最初のフォーカスされたアイテムになるのを防ぎます。
詳細については、 この回答 を参照してください。
上記の答えに基づいて:
<!-- 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"/>
私が働いていることがわかった最も簡単なものは:
numberPicker = (NumberPicker) myDialogView.findViewById(R.id.myViewId);
EditText numberPickerChild = (EditText) numberPicker.getChildAt(0);
numberPickerChild.setFocusable(false);
numberPickerChild.setInputType(InputType.TYPE_NULL);
なぜ機能するのかはわかりませんが、何もしないOnClickListenerを設定すると、キーボードが表示されなくなります(Lollipop)
numberPicker.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
/**
* 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();
}
}
}
*これを呼び出す:
子孫のフォーカス可能性をブロックしません(numberpickerは編集可能です)
作成時にソフト入力を非表示にします
(入力の処理)getValue()が適切な値を取得する前に
作業コードプログラム的に:
mp.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);
XML:
Android:descendantFocusability="blocksDescendants"