web-dev-qa-db-ja.com

アンドロイド:EditTextにフォーカスを外すよう強制する?

EditTextからフォーカスを外したいと思います。たとえば、キーボードが表示され、ユーザーが戻るボタンでそれを隠した場合、フォーカスとカーソルは消えます。どうすればそれができますか?

306
Alex1987

これをonCreateに追加すると、アクティビティーが始まるたびにキーボードを隠します。

プログラムでフォーカスを別の項目に変更することもできます。

this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
232
Wayner

カーソルとフォーカスを消すことができます。

edittext.clearFocus();

しかし、キーボードの非表示が難しい作業になったことを検出します。

295
xtr

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" />
137
Singh Arjun

フォーカスを外しますが、フォーカス可能のままにします。

editText.setFocusableInTouchMode(false);
editText.setFocusable(false);
editText.setFocusableInTouchMode(true);
editText.setFocusable(true);

EditTextはフォーカスを失いますが、新しいタッチイベントで再び得ることができます。

83
Paschalis

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()の呼び出しは機能します。

64
sondt87

これら2つのプロパティを親レイアウトに追加します(例:線形レイアウト、相対レイアウト)。

Android:focusable="true"
Android:focusableInTouchMode="true" 

それはうまくいくでしょう:)

47
King of Masses

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);
30
Jarod DY Law

私のために働いたあなたの見解でこれを使用してみてください:

<View
    Android:id="@+id/fucused"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:focusable="true"
    Android:focusableInTouchMode="true"/>
17
ediBersh

あなたのEditText this Android:focusableInTouchMode="true"をどこに置きましたか?

16
Context

<requestFocus/>を削除する必要があります

あなたがそれを使わなくても同じ問題があるのなら

親およびセットとしてのユーザーLinearLayout

Android:focusable="true"
Android:focusableInTouchMode="true"

あなたのお役に立てば幸いです。

16
Mohamed Hussien

アクティビティの開始時にキーボードを隠すには.. onCreate()に次のコードを書きます。

InputMethodManager imm = (InputMethodManager)
getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);

フォーカスをクリアしてカーソルをedittextから削除するには.....

editText.clearFocus();

editText.setCursorVisible(false);
13
Pratibha Sarode

これが私のSOに対する最初の答えです。間違いがあっても私にはそれほど過酷ではありません。 :D

SOにまつわる答えはほとんどありませんが、私は自分の完全な解決策を投稿することを強く望んでいるため、これが私の心を動かしました。私はみんなにそれぞれのクレジットを与えないならば私をあちこちから少しずつ掴んだので許してください... :)

(私のビューには多すぎる要素があるので結果を単純化します。そしてそれをスパムしたくないのでできるだけ一般的にしようとします...)

あなたのレイアウトのためにあなたはあなたのEditTextparent 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"

EditTextActivityの後に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ソリューションの部分。私が自分自身を把握しなければならなかったことを見逃したのは、EditTextsetOnEditorActionListenerおよびparent view)のonTouchListerの両方に追加したもの)に焦点を当てることです。

これが誰かを助け、時間を節約できることを願っています。 :)

乾杯、Z。

9
zed

コメントでは、EditTextの代わりに別のビューにフォーカスできるかどうかを尋ねました。はい、できます。最初にフォーカスしたいビューに.requestFocus()メソッドを使用します(onCreate()メソッド内)

また、他のビューに焦点を合わせると、いくらかのコードが切り取られます。 (キーボードを隠すためのコードなど)

6

マニフェストアクションセクションにAndroid:windowSoftInputMode="stateAlwaysHidden"を含めることもできます。

これは以下と同等です。

this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
3
user2471325

私は同じ問題を抱えていました。それは私をクレイジー以上にしました。

私は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

3
Pixtar
editText.setFocusableInTouchMode(true)

ユーザーがタッチするとEditTextがフォーカスを取得することができます。メインレイアウト(アクティビティ、ダイアログなど)が表示されるようになると、それがレイアウトの最初のビューであってもEditTextは自動的にフォーカスを取得しません。

2
Fabio Mitrano
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;
                }
            }
        });
2
Abhi

親要素の属性 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"に設定されているため、子要素へのフォーカスがブロックされています。

あなたはより多くの情報を見つけることができます ここ

0
podpo