[Android] アクティビティ起動時にEditTextがフォーカスを取得しないようにする



Answers

実際に問題になっているのは、まったく焦点を当てたくないということですか? または、 EditTextに焦点を当てた結果、仮想キーボードを表示したくないのですか? 私は実際にEditText開始に焦点を当てた問題は見ませんが、ユーザーがEditTextに集中して結果としてキーボードを開くように明示的に要求していないときにsoftInputウィンドウを開くことは間違いありません。

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

android:windowSoftInputMode="stateHidden" - アクティビティに入るときに常に非表示にします。

またはandroid:windowSoftInputMode="stateUnchanged" - 変更しないでください(たとえば、まだ表示されていない場合は表示しませんが、アクティビティに入るときに開いていた場合は開いたままにしてください)。

Question

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

  1. EditText
  2. ListView

私のActivityが始まると、 EditTextすぐに入力フォーカス(点滅カーソル)を持っています。 私は起動時に入力フォーカスを持たせたくない。 私は試した:

EditText.setSelected(false);

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




このコードを、キーボードを開かないActivity Manifestファイルの中に記述します。

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>



layout最初のTextView値をtrueにするには、単に"focusable""focusable in focus mode"を設定することができlayout 。 このようにしてアクティビティが開始されると、 TextViewにフォーカスが当てられますが、その性質上、画面上に何も表示されず、キーボードは表示されません




onCreateメソッドで次のように追加します。

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



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

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



私が見つけた唯一の解決策は次のとおりです。

  • LinearLayout作成する(他の種類のレイアウトが機能するかどうかはLinearLayoutない)
  • 属性を設定するandroid:focusable="true" android:focusableInTouchMode="true"

そして、 EditTextは、アクティビティの開始後にフォーカスを取得しません




このソリューションのどれも私のために働いたことはありません。 私がオートフォーカスを修正する方法は:

<activity android:name=".android.InviteFriendsActivity" android:windowSoftInputMode="adjustPan">
    <intent-filter >
    </intent-filter>
</activity>



機能性に関連する何かを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;
}



xmlのEditTextタグから"<requestFocus />"行を削除してください。

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

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



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

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

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

button = (Button) findViewById(R.id.button);
button.requestFocus();



他のポスターから提供された情報を使用して、私は以下のソリューションを使用しました:

レイアウト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();
}



私はプログラム的にすべてのフィールドからフォーカスをクリアする必要がありました。 私は主なレイアウト定義に次の2つのステートメントを追加しました。

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

それでおしまい。 私の問題を直ちに解決しました。 ありがとう、シルバー、正しい方向に私を指しています。




ListViewようなアクティビティの別のビューがある場合は、次の操作を行うこともできます。

ListView.requestFocus(); 

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

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




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

    <!-- 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" />

問題のある焦点を絞ったビューの前に、これをビューとして置いてください。それだけです。




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




Links