EditTextからフォーカスを外したいと思います。たとえば、キーボードが表示され、ユーザーが戻るボタンでそれを隠した場合、フォーカスとカーソルは消えます。どうすればそれができますか?
これをonCreate
に追加すると、アクティビティーが始まるたびにキーボードを隠します。
プログラムでフォーカスを別の項目に変更することもできます。
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
カーソルとフォーカスを消すことができます。
edittext.clearFocus();
しかし、キーボードの非表示が難しい作業になったことを検出します。
XMLのLinearLayout
の前にEditText
を追加します。
<LinearLayout
Android:focusable="true"
Android:focusableInTouchMode="true"
Android:clickable="true"
Android:layout_width="0px"
Android:layout_height="0px" />
または、EditTextの前にこれらの行を追加して表示することもできます。
<Button
Android:id="@+id/btnSearch"
Android:layout_width="50dp"
Android:layout_height="50dp"
Android:focusable="true"
Android:focusableInTouchMode="true"
Android:gravity="center"
Android:text="Quick Search"
Android:textColor="#fff"
Android:textSize="13sp"
Android:textStyle="bold" />
<EditText
Android:id="@+id/edtSearch"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignParentLeft="true"
Android:layout_centerVertical="true"
Android:layout_marginRight="5dp"
Android:gravity="left"
Android:hint="Name"
Android:maxLines="1"
Android:singleLine="true"
Android:textColorHint="@color/blue"
Android:textSize="13sp"
Android:textStyle="bold" />
editText.setFocusableInTouchMode(false);
editText.setFocusable(false);
editText.setFocusableInTouchMode(true);
editText.setFocusable(true);
EditTextはフォーカスを失いますが、新しいタッチイベントで再び得ることができます。
autofocus edittext Androidを削除します
それは私のために働いています
編集 リンク内ではLinearLayoutを使用することを推奨していますが、単純なビューでも機能します。
<View
Android:id="@+id/focus_thief"
Android:layout_width="1dp"
Android:layout_height="1dp"
Android:focusable="true"
Android:focusableInTouchMode="true" />
次に、この「泥棒」が(最初にフォーカスできる項目になるように)レイアウトの一番上に配置されている場合、clearFocus()
の呼び出しは機能します。
これら2つのプロパティを親レイアウトに追加します(例:線形レイアウト、相対レイアウト)。
Android:focusable="true"
Android:focusableInTouchMode="true"
それはうまくいくでしょう:)
Android:windowSoftInputMode = "stateAlwaysHidden" をマニフェストアクションセクションに含めることもできます。
これは以下と同等です。
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
しかしXMLのやり方で。
参考までに、キーボードでコードを隠すこともできます。
// hide virtual keyboard
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mYourEditText.getWindowToken(), 0);
私のために働いたあなたの見解でこれを使用してみてください:
<View
Android:id="@+id/fucused"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:focusable="true"
Android:focusableInTouchMode="true"/>
あなたのEditText
this Android:focusableInTouchMode="true"
をどこに置きましたか?
<requestFocus/>
を削除する必要があります
あなたがそれを使わなくても同じ問題があるのなら
親およびセットとしてのユーザーLinearLayout
Android:focusable="true"
Android:focusableInTouchMode="true"
あなたのお役に立てば幸いです。
アクティビティの開始時にキーボードを隠すには.. onCreate()に次のコードを書きます。
InputMethodManager imm = (InputMethodManager)
getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);
フォーカスをクリアしてカーソルをedittextから削除するには.....
editText.clearFocus();
editText.setCursorVisible(false);
これが私のSOに対する最初の答えです。間違いがあっても私にはそれほど過酷ではありません。 :D
SOにまつわる答えはほとんどありませんが、私は自分の完全な解決策を投稿することを強く望んでいるため、これが私の心を動かしました。私はみんなにそれぞれのクレジットを与えないならば私をあちこちから少しずつ掴んだので許してください... :)
(私のビューには多すぎる要素があるので結果を単純化します。そしてそれをスパムしたくないのでできるだけ一般的にしようとします...)
あなたのレイアウトのためにあなたはあなたのEditTextとparent view)の親が必要です。
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:orientation="vertical"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:id="@+id/lytContainer"
Android:descendantFocusability="beforeDescendants"
Android:focusableInTouchMode="true">
<EditText Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:id="@+id/etEditor"
Android:inputType="number"
Android:layout_gravity="center"
Android:hint="@string/enter_your_text"
Android:textColor="@Android:color/darker_gray"
Android:textSize="12dp"
Android:textAlignment="center"
Android:gravity="center"
Android:clickable="true"/>
</LinearLayout>
だから、私はここでいくつかのことが必要でした。私は自分のEditTextのためのプレースホルダーを持っている必要がありました - それは -
Android:ヒント= "ヒント"
また、
Android:descendantFocusability="beforeDescendants"
Android:focusableInTouchMode="true"
EditTextがActivityの後にActivity自体を入力することに集中しないように設定すると、この設定に役立ちますので、onTouchListeneronに設定できます)フォーカスをEditText)から離します。
今、活動の中で:
package com.at.keyboardhide;
import Android.app.Activity;
import Android.content.Context;
import Android.os.Bundle;
import Android.view.MotionEvent;
import Android.view.View;
import Android.view.WindowManager;
import Android.view.View.OnTouchListener;
import Android.view.inputmethod.InputMethodManager;
import Android.widget.EditText;
import Android.widget.LinearLayout;
public class MainActivity extends Activity implements OnTouchListener{
private EditText getEditText;
private LinearLayout getLinearLayout;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
setContentView(R.layout.keyboardmain);
getEditText = (EditText)findViewById(R.id.etEditor);
getLinearLayout = (LinearLayout)findViewById(R.id.lytContainer);
getLinearLayout.setOnTouchListener(this);
getEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
Log.d("EDTA", "text was entered.");
getEditText.clearFocus();
imm.hideSoftInputFromWindow(barcodeNo.getWindowToken(), 0);
return true;
}
return false;
}
});
}
@Override
public boolean onTouch(View v, MotionEvent event) {
if(v==getLinearLayout){
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getEditText.getWindowToken(), 0);
getEditText.clearFocus();
return true;
}
return false;
}
}
私がこの質問ページで見つけたビットのための答えのほとんど、そして私がこの blog で見つけたActivityソリューションの部分。私が自分自身を把握しなければならなかったことを見逃したのは、EditTextとsetOnEditorActionListenerおよびparent view)のonTouchListerの両方に追加したもの)に焦点を当てることです。
これが誰かを助け、時間を節約できることを願っています。 :)
乾杯、Z。
コメントでは、EditTextの代わりに別のビューにフォーカスできるかどうかを尋ねました。はい、できます。最初にフォーカスしたいビューに.requestFocus()
メソッドを使用します(onCreate()メソッド内)
また、他のビューに焦点を合わせると、いくらかのコードが切り取られます。 (キーボードを隠すためのコードなど)
マニフェストアクションセクションにAndroid:windowSoftInputMode="stateAlwaysHidden"
を含めることもできます。
これは以下と同等です。
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
私は同じ問題を抱えていました。それは私をクレイジー以上にしました。
私はSeekBarとEditTextを含む拡張LinearLayoutとTableLayoutを持つScrollViewと拡張Dialogを持っていました。
最初のEditTextは、Dialogを表示した後、およびキーボードでテキストを編集し終えた後も常にオートフォーカスされていましたが、EditTextにはまだフォーカスがあり、キーボードは表示されていました。
私はこのスレッドのほぼすべての解決策を試しましたが、どれも私のために働きませんでした。
だからここに私の 簡単な解決策 :(text = EditText)
text.setOnEditorActionListener( new OnEditorActionListener( ){
public boolean onEditorAction( TextView v, int actionId, KeyEvent event ){
if( (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) ||
(actionId == EditorInfo.IME_ACTION_DONE) ){
text.clearFocus( );
InputMethodManager iMgr = null;
iMgr = (InputMethodManager)mContext.getSystemService( Context.INPUT_METHOD_SERVICE );
iMgr.hideSoftInputFromWindow( text.getWindowToken(), 0 );
}
return true;
}
});
ちなみに私は - しなかった それを解決するために次のスニペットのいずれかを使用しました:
//setFocusableInTouchMode( true )
//setFocusable( true )
//setDescendantFocusability( ViewGroup.FOCUS_BEFORE_DESCENDANTS )
AND I not 幅と高さが1dpのビューのようなスペーサーアイテムを使用しました。
うまくいけば、それは誰かに役立ちます:D
editText.setFocusableInTouchMode(true)
ユーザーがタッチするとEditText
がフォーカスを取得することができます。メインレイアウト(アクティビティ、ダイアログなど)が表示されるようになると、それがレイアウトの最初のビューであってもEditText
は自動的にフォーカスを取得しません。
EditText.setOnKeyListener(new OnKeyListener() {
public boolean onKey(View view, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_ENTER) {
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(URLText.getWindowToken(), 0);
EditText.setFocusable(false);
EditText.setFocusableInTouchMode(true);
return true;
} else {
return false;
}
}
});
親要素の属性 Android:descendantFocusability を設定することで、要素へのフォーカスを避けることができます。
これが一例です。
<ScrollView xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:id="@+id/search__scroller"
Android:descendantFocusability="blocksDescendants"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:layout_alignParentLeft="true"
Android:layout_alignParentTop="true" >
</ScrollView>
ここでは、属性 "Android:descendantFocusability"が "blocksDescendants"に設定されているため、子要素へのフォーカスがブロックされています。
あなたはより多くの情報を見つけることができます ここ 。