web-dev-qa-db-ja.com

アクティビティの起動時にEditTextがフォーカスを得られないようにする

私はAndroidに2つの要素を持つActivityを持っています。

  1. EditText 
  2. ListView

私のActivityが起動すると、EditTextはすぐに入力フォーカスを取得します(カーソルの点滅)。起動時にコントロールに入力フォーカスを設定したくありません。私は試した:

EditText.setSelected(false);

運がありません。 EditTextの開始時にActivityが自分自身を選択しないようにするにはどうすればよいですか。

2581
Mark

LucとMarkの優れた回答ですが、優れたコードサンプルはありません。次の例のようにAndroid:focusableInTouchMode="true"にタグ<LinearLayout>を追加すると、問題が解決します。

<!-- Dummy item to prevent AutoCompleteTextView 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 -->
<AutoCompleteTextView Android:id="@+id/autotext"
    Android:layout_width="fill_parent" 
    Android:layout_height="wrap_content"
    Android:nextFocusUp="@id/autotext" 
    Android:nextFocusLeft="@id/autotext"/>
2265

実際に問題になっているのは、まったく焦点を合わせたくないということですか。それともEditTextにフォーカスした結果として仮想キーボードを表示させたくないですか? EditTextが起動時にフォーカスしているという問題は実際には見られませんが、ユーザーがEditTextにフォーカスすることを明示的に要求しなかった場合(その結果としてキーボードを開いた場合).

それが仮想キーボードの問題である場合は、AndroidManifest.xml<activity>要素 のドキュメントを参照してください。

Android:windowSoftInputMode="stateHidden" - アクティビティに入るときは常に隠します。

またはAndroid:windowSoftInputMode="stateUnchanged" - 変更しないでください(例:don't show itがまだ表示されていない場合は、開いていた場合は開いたままにしてください)。

1605
Joe

もっと簡単な解決策があります。親レイアウトにこれらの属性を設定します。

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/mainLayout"
    Android:descendantFocusability="beforeDescendants"
    Android:focusableInTouchMode="true" >

そして今、アクティビティが始まると、このメインレイアウトがデフォルトでフォーカスされます。

また、次のように、メインレイアウトにフォーカスを再度設定することで、実行時に子ビューからフォーカスを削除することもできます(例:子の編集が終了した後)。

findViewById(R.id.mainLayout).requestFocus();

良いコメント from Guillaume Perrot

Android:descendantFocusability="beforeDescendants"はデフォルトのようです(整数値は0です)。 Android:focusableInTouchMode="true"を追加するだけで動作します。

実際、ViewGroup.initViewGroup()メソッドでbeforeDescendantsがデフォルトとして設定されていることがわかります(Android 2.2.2)。しかし、0とは異なります。ViewGroup.FOCUS_BEFORE_DESCENDANTS = 0x20000;

Guillaumeに感謝します。

1060
Silver

私が見つけた唯一の解決策は:

  • LinearLayout を作成します。
  • 属性Android:focusable="true"Android:focusableInTouchMode="true"を設定します

そしてEditTextは活動を始めた後に焦点を当てません

403
Luc

問題は私がレイアウトのXML formでしか見ることができない特性から来るようです。

EditText XMLタグ内の宣言の最後でこの行を必ず削除してください。

<requestFocus />

それはそのような何かを与えるはずです:

<EditText
   Android:id="@+id/emailField"
   Android:layout_width="fill_parent"
   Android:layout_height="wrap_content"
   Android:inputType="textEmailAddress">

   //<requestFocus /> /* <-- without this line */
</EditText>
73
floydaddict

他のポスターから提供された情報を使用して、私は次の解決策を使用しました。

レイアウトXML内

<!-- Dummy item to prevent AutoCompleteTextView from receiving focus -->
<LinearLayout
    Android:id="@+id/linearLayout_focus"
    Android:focusable="true"
    Android:focusableInTouchMode="true"
    Android:layout_width="0px"
    Android:layout_height="0px"/>

<!-- AUTOCOMPLETE -->
<AutoCompleteTextView
    Android:id="@+id/autocomplete"
    Android:layout_width="200dip"
    Android:layout_height="wrap_content"
    Android:layout_marginTop="20dip"
    Android:inputType="textNoSuggestions|textVisiblePassword"/>

onCreate()内

private AutoCompleteTextView mAutoCompleteTextView;
private LinearLayout mLinearLayout;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mylayout);

    //get references to UI components
    mAutoCompleteTextView = (AutoCompleteTextView) findViewById(R.id.autocomplete);
    mLinearLayout = (LinearLayout) findViewById(R.id.linearLayout_focus);
}

そして最後に、onResume()で

@Override
protected void onResume() {
    super.onResume();

    //do not give the editbox focus automatically when activity starts
    mAutoCompleteTextView.clearFocus();
    mLinearLayout.requestFocus();
}
67

setSelected(false)の代わりに clearFocus() を試してください。 Androidのすべてのビューはフォーカス可能性と選択可能性の両方を持っています、そしてあなたはただフォーカスをクリアしたいと思います。

63
Konklone

次はedittextが作成されたときにフォーカスを合わせるのを止めますが、触ったときにそれをつかみます。

<EditText
    Android:id="@+id/et_bonus_custom"
    Android:focusable="false" />

そのため、xmlでfocusableをfalseに設定しましたが、キーはJavaにあります。これに次のリスナーを追加します。

etBonus.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        v.setFocusable(true);
        v.setFocusableInTouchMode(true);
        return false;
    }
});

あなたがfalseを返している、すなわちイベントを消費していないので、フォーカシングの振る舞いは通常通り進行します。

63
MinceMan

私はいくつかの答えを個別に試してみましたが、焦点はまだEditTextにあります。私は以下の解決策のうちの2つを一緒に使ってそれを解決することができただけです。

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
  Android:id="@+id/mainLayout"
  Android:descendantFocusability="beforeDescendants"
  Android:focusableInTouchMode="true" >

(Silverからの参照 https://stackoverflow.com/a/8639921/15695

と削除

 <requestFocus />

editTextで 

(floydaddict /からの参照 https://stackoverflow.com/a/9681809

50
Lee Yi Hong

この解決策のどれも私のために働きませんでした。オートフォーカスを修正する方法は次のとおりです。

<activity Android:name=".Android.InviteFriendsActivity" Android:windowSoftInputMode="adjustPan">
    <intent-filter >
    </intent-filter>
</activity>
40
rallat

簡単な解決策: AndroidManifestタグ内のActivity

Android:windowSoftInputMode="stateAlwaysHidden"
37
Sergey Sheleg

"focusable" および "タッチモードでフォーカス可能" を、TextViewの最初のlayoutでtrueに設定するだけです。このようにして、アクティビティが開始されるとTextViewがフォーカスされますが、その性質上、画面にフォーカスされたものは何も表示されず、もちろん no キーボードが表示されます。

32
Zeus

以下はManifestで私のために働きました。書きます 、

<activity
Android:name=".MyActivity"
Android:windowSoftInputMode="stateAlwaysHidden"/>
31
Babar Sanah

最も単純な答えは、これをXMLの親レイアウトに追加するだけです。

Android:focusable="true" 
Android:focusableInTouchMode="true"
28
Rishabh Saxena

私はプログラム的にすべての分野から焦点を明確にする必要がありました。メインのレイアウト定義に次の2つのステートメントを追加しました。

myLayout.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
myLayout.setFocusableInTouchMode(true);

それでおしまい。即座に私の問題を修正しました。シルバー、私を正しい方向に向けてくれてありがとう。

26
jakeneff

Android:windowSoftInputMode="stateAlwaysHidden"ファイルのactivityタグにManifest.xmlを追加します。

出典

24
prgmrDev

あなたがListViewのようなあなたの活動について別の見方をしているならば、あなたもすることができます:

ListView.requestFocus(); 

あなたのonResume()editTextからフォーカスを取得します。

私はこの質問が答えられたことを知っていますが、私のために働いた代替ソリューションを提供するだけです:)

19
Sid

最初の編集可能フィールドの前にこれを試してください。

<TextView  
        Android:id="@+id/dummyfocus" 
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content" 
        Android:text="@string/foo"
        />

----

findViewById(R.id.dummyfocus).setFocusableInTouchMode(true);
findViewById(R.id.dummyfocus).requestFocus();
18
Jack Slater

onCreateメソッドに以下を追加します。

this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
18
Vishal Raj

機能に関連するものでXMLを汚染したくないので、最初のフォーカス可能なビューからフォーカスを「透過的に」取得し、必要に応じて自分自身を削除するようにします。

public static View preventInitialFocus(final Activity activity)
{
    final ViewGroup content = (ViewGroup)activity.findViewById(Android.R.id.content);
    final View root = content.getChildAt(0);
    if (root == null) return null;
    final View focusDummy = new View(activity);
    final View.OnFocusChangeListener onFocusChangeListener = new View.OnFocusChangeListener()
    {
        @Override
        public void onFocusChange(View view, boolean b)
        {
            view.setOnFocusChangeListener(null);
            content.removeView(focusDummy);
        }
    };
    focusDummy.setFocusable(true);
    focusDummy.setFocusableInTouchMode(true);
    content.addView(focusDummy, 0, new LinearLayout.LayoutParams(0, 0));
    if (root instanceof ViewGroup)
    {
        final ViewGroup _root = (ViewGroup)root;
        for (int i = 1, children = _root.getChildCount(); i < children; i++)
        {
            final View child = _root.getChildAt(i);
            if (child.isFocusable() || child.isFocusableInTouchMode())
            {
                child.setOnFocusChangeListener(onFocusChangeListener);
                break;
            }
        }
    }
    else if (root.isFocusable() || root.isFocusableInTouchMode())
        root.setOnFocusChangeListener(onFocusChangeListener);

    return focusDummy;
}
14
Takhion

遅くなりましたが、おそらく役に立ちました。レイアウトの一番上にダミーのEditTextを作成し、myDummyEditText.requestFocus()の中でonCreate()を呼び出します。

<EditText Android:id="@+id/dummyEditTextFocus" 
Android:layout_width="0px"
Android:layout_height="0px" />

それは私の期待通りに振る舞うようです。設定の変更などを処理する必要はありません。長いTextView(手順)を使用してActivityにこれを必要としました。

13
Jim

この行を親レイアウトに書きます...

 Android:focusableInTouchMode="true"
12
Vishal Vaishnav

うん私も同じことをした - 最初の焦点を取得する「ダミー」の線形レイアウトを作成します。さらに、「次の」フォーカスIDを設定して、ユーザーが一度スクロールした後にそれ以上フォーカスできなくなるようにします。

<LinearLayout 'dummy'>
<EditText et>

dummy.setNextFocusDownId(et.getId());

dummy.setNextFocusUpId(et.getId());

et.setNextFocusUpId(et.getId());

ビューへのフォーカスを取り除くための多くの作業 

ありがとう

12
mark

私にとって、すべてのデバイスでうまくいったのはこれです。

    <!-- fake first focusable view, to allow stealing the focus to itself when clearing the focus from others -->

    <View
    Android:layout_width="0px"
    Android:layout_height="0px"
    Android:focusable="true"
    Android:focusableInTouchMode="true" />

これを問題のある集中的なビューの前にビューとして配置するだけです。

10

これは完璧で最も簡単な解決策です。私はいつもこれを私のアプリで使用しています。 

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
9
user4728480

私がした最も簡単なことはonCreateで別のビューに焦点を合わせることです:

    myView.setFocusableInTouchMode(true);
    myView.requestFocus();

これによりソフトキーボードの起動が停止し、EditTextにカーソルが点滅しなくなりました。

8
Lumis
<TextView
    Android:id="@+id/TextView01"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:layout_weight="1"
    Android:singleLine="true"
    Android:ellipsize="Marquee"
    Android:marqueeRepeatLimit="Marquee_forever"
    Android:focusable="true"
    Android:focusableInTouchMode="true"
    style="@Android:style/Widget.EditText"/>
7
atul

キーボードを開かないManifestActivityファイル内にこのコードを書いてください。

Android:windowSoftInputMode="stateHidden"

マニフェストファイル:

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.example.projectt"
    Android:versionCode="1"
    Android:versionName="1.0" >

    <uses-sdk
        Android:minSdkVersion="8"
        Android:targetSdkVersion="24" />

    <application
        Android:allowBackup="true"
        Android:icon="@drawable/ic_launcher"
        Android:label="@string/app_name"
        Android:theme="@style/AppTheme" >
         <activity
            Android:name=".Splash"
            Android:label="@string/app_name" >
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />

                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            Android:name=".Login"
            **Android:windowSoftInputMode="stateHidden"**
            Android:label="@string/app_name" >
        </activity>

    </application>

</manifest>
7
Tarit Ray

あなたのアクティビティのonCreateで、あなたのEditText要素にuse clearFocus()を追加するだけです。例えば、

edittext = (EditText) findViewById(R.id.edittext);
edittext.clearFocus();

また、フォーカスを別の要素に変更したい場合は、その上でrequestFocus()を使用してください。例えば、

button = (Button) findViewById(R.id.button);
button.requestFocus();
6
Compaq LE2202x

キーボードを隠す最も簡単な方法はsetSoftInputModeを使うことです 

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

または、InputMethodManagerを使用してこのようにキーボードを隠すこともできます。

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);
6
Anonymous

アクティビティを開くと、キーボードが自動的に表示され、EditTextにフォーカスが移動します。 manifest.xmlファイルのactivityタグに次の行を書き込むことでキーボードを無効にできます。

 Android:windowSoftInputMode="stateAlwaysHidden|adjustPan"
6
Mansuu....

これを実現するには、レイアウトの幅と高さを0dpに設定したダミーのEditTextを作成し、そのビューにフォーカスを要求します。

<EditText
    Android:id="@+id/editText0"
    Android:layout_width="0dp"
    Android:layout_height="0dp"
    Android:hint="@string/dummy"
    Android:ems="10" 
    >
     <requestFocus />
    </EditText>
6
Ish

XmlのEditTextタグから"<requestFocus />"という行を必ず削除してください。

<EditText
   Android:id="@+id/input"
   Android:layout_width="fill_parent"
   Android:layout_height="wrap_content">

   <requestFocus /> <!-- remove this line --> 
</EditText>
6

次のコードを使用して、ボタンが押されたときにEditTextがフォーカスを盗まないようにします。

addButton.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        View focused = internalWrapper.getFocusedChild();
        focused.setVisibility(GONE);
        v.requestFocus();
        addPanel();
        focused.setVisibility(VISIBLE);
    }
});

基本的には、編集テキストを非表示にしてからもう一度表示します。 EditTextはビュー内で not であるのでこれは私にとってはうまくいくので、表示されているかどうかは関係ありません。

それを隠してそれを連続して見せて、それが焦点を失うのに役立つかどうかを確かめることができます。

5
drei01
/** 
 * set focus to top level window
 * disposes descendant focus 
 * disposes softInput 
 * */
public static void topLevelFocus(Context context){
    if(Activity.class.isAssignableFrom(context.getClass())){
        ViewGroup tlView = (ViewGroup) ((Activity) context).getWindow().getDecorView();
        if(tlView!=null){
            tlView.setFocusable(true);
            tlView.setFocusableInTouchMode(true);
            tlView.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
        }
    }
}
4
ceph3us
View current = getCurrentFocus();

if (current != null) 
    current.clearFocus();
4
DkPathak

最も簡単な方法は、 Manifest.xml ファイルのactivityタグにAndroid:windowSoftInputMode="stateAlwaysHidden"を追加することです。

3
Karthik

EditText内のListViewは正しく機能しません。 TableLayoutを使用している場合は、自動的に生成された行でEditTextを使用することをお勧めします。

3
MSIslam

やってみる

edit.setInputType(InputType.TYPE_NULL);

edit.setEnabled(false);
3
Albert Oclarit

私はこのような問題を抱えていました、そしてそれは私の選択者のせいでした。最初の状態は、それが一致し使用した最初の状態だったので、フォーカス状態になったという私の見方が無効であってもフォーカスでした。次のように最初の状態を無効に設定できます。

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">


<item Android:drawable="@drawable/text_field_disabled" Android:state_enabled="false"/>
<item Android:drawable="@drawable/text_field_focused" Android:state_focused="true"/>
<item Android:drawable="@drawable/text_field_normal"/>

2
j2emanue
<EditText
    Android:layout_width="match_parent"
    Android:layout_height="100dp"
    Android:id="@+id/etComments"
    Android:hint="Comments.."
    Android:textSize="14dp"

    Android:focusable="false"

    Android:textStyle="italic"/>
2

OnCreate()で無効にする

final KeyListener edtTxtMessageKeyListener = edtTxtMessage.getKeyListener();
edtTxtMessage.setCursorVisible(false);
edtTxtMessage.setKeyListener(null);

そして最後にEditTextのonClick()で有効にします

edtTxtMessage.setCursorVisible(true);
edtTxtMessage.setKeyListener(edtTxtMessageKeyListener);

しかし問題は、OnScreenKeyboardを初めて起動するためにtwiseをクリックする必要があることです。

@回避策

InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);

onClick()でも試してください:)

2
Amit Yadav

Request focusを使用してキーボードの非表示コードを使用することで、他のウィジェットにフォーカスを指定できます。

2
Mary's

xMLファイルの編集テキストからremove<requestFocus />を削除します。

<EditText
   Android:id="@+id/emailField"
   Android:layout_width="fill_parent"
   Android:layout_height="wrap_content"
   Android:inputType="textEmailAddress">

   //`<requestFocus />` /* <-- remove this tags */
</EditText>`
2
Akshay Paliwal

これをして、あなたの仕事を成し遂げましょう!

Android:focusable="true"
Android:focusableInTouchMode="true" 
2
Tulsi

あなたは編集テキストとリストを持っています。 OnStart/On Createでは、リストビューにフォーカスを設定する必要があります。Listview.requestfocus()

1
hassan mirza

アクティビティの開始時にキーボードを隠したい場合それから言及

Android:windowSoftInputMode = "stateHidden"

マニフェストファイルのそのアクティビティに。問題は解決します。

乾杯。

0
Rohit Patil

送信ボタンですべてのフォーカスをクリアします

// xml file
<LinearLayout
...
Android:id="@+id/linear_layout"
Android:focusableInTouchMode="true"> // 1. make this focusableInTouchMode...
</LinearLayout>

// Activity file
private LinearLayout mLinearLayout; // 2. parent layout element
private Button mButton;

mLinearLayout = findViewById(R.id.linear_layout);
mButton = findViewById(R.id.button);

  mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mLinearLayout.requestFocus(); // 3. request focus

            }
        });

これがあなたのお役に立てば幸いです:)

0
Bukunmi

あなたの活動について述べたマニフェストファイルの下の行を追加

Android:windowSoftInputMode="stateAlwaysHidden"

これはEditTextを継承してonTouchEventをオーバーライドすることで実現できます。

class NonFocusableEditText: EditText {

    constructor(context: Context): super(context)
    constructor(context: Context, attrs: AttributeSet?): super(context, attrs)
    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int): super(context, attrs, defStyleAttr)

    override fun onTouchEvent(event: MotionEvent?): Boolean {
        return if (isFocusable) super.onTouchEvent(event) else false
    }
}

それから通常のEditTextのようなレイアウトでそれを使うことができます:

<com.yourpackage.NonFocusableEditText
        Android:id="@+id/editText"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"    
        Android:hint="@string/your_hint"
        Android:imeOptions="actionDone"
        Android:inputType="textNoSuggestions" />
0
mmBs