これについて議論している他の質問を読んだことがありますが、それらはすべて私のレイアウトで機能します。最初に作成されたものはexceptです。
現時点では、これは私のonCreate
メソッドの一番上にあります:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
^これにより、少なくとも起動時にキーボードがポップアップしないようになりますが、EditText
は引き続き注目されます。
これは私のXML
のEditText
です:
<EditText
Android:id="@+id/password"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_below="@+id/changePass"
Android:layout_centerHorizontal="true"
Android:layout_marginTop="167dp"
Android:ems="10"
Android:imeOptions="flagNoExtractUi"
Android:inputType="textPassword"
Android:maxLength="30" >
</EditText>
これは、アクティビティを立ち上げると次のようになります。
問題は、一部の携帯電話では、EditText
がこのようにフォーカスされている場合、書き込みできないことです。 notフォーカスしたい。
私がやったことは、EditTexts
に焦点が当てられておらず、次のように見えるという点で、次のレイアウトで機能します。
ただし、同じレイアウトであることに注意してください。これは、ユーザーがこの画面に戻された後の画面です。これは、XML
と同じであるためXML
に何も問題がないことを示しますが、問題はEditText
がアクティビティが作成されたときにのみ焦点を当てます。
私は調査を行ったが、他の質問はすべてこれを助けてくれない(しかし、ありがたいことにキーボードが表示されないのを助けた)。起動時にEditText
が最初のスクリーンショットではなく、2番目のスクリーンショットのように見えるようにするにはどうすればよいですか?
Android:descendantFocusability="beforeDescendants"
やAndroid:focusableInTouchMode="true"
などのレイアウトのプロパティを設定できます
例:
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/mainLayout"
Android:descendantFocusability="beforeDescendants"
Android:focusableInTouchMode="true" >
<EditText
Android:id="@+id/password"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_below="@+id/changePass"
Android:layout_centerHorizontal="true"
Android:layout_marginTop="167dp"
Android:ems="10"
Android:imeOptions="flagNoExtractUi"
Android:inputType="textPassword"
Android:maxLength="30" >
</EditText>
</RelativeLayout>
これが参考になりますように;)
XMLコード:
<EditText
Android:id="@+id/password"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_below="@+id/changePass"
Android:layout_centerHorizontal="true"
Android:layout_marginTop="167dp"
Android:ems="10"
Android:focusable="false"
Android:imeOptions="flagNoExtractUi"
Android:inputType="textPassword"
Android:maxLength="30" >
</EditText>
Javaコード:
EditText edPwd = (EditText)findViewById(R.id.password);
edtPwd.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
v.setFocusable(true);
v.setFocusableInTouchMode(true);
return false;
}
});
xMLでfocusableをfalseに設定し、コードを介してtrueに設定します
Main_layoutに次の2行を追加します。
Android:descendantFocusability="beforeDescendants"
Android:focusableInTouchMode="true"
例:
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:descendantFocusability="beforeDescendants"
Android:focusableInTouchMode="true"> *YOUR LAYOUT CODE* </RelativeLayout>
これをonCreate()に追加します
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
またはonCreateView()で
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
XMLコード
<EditText
Android:imeOptions="flagNoExtractUi"
Android:focusable="false"
/>
OnClickListernerのJavaコード
mEdtEnterPhoneNumber.setFocusable(true);
mEdtEnterPhoneNumber.setFocusableInTouchMode(true);
最適なソリューションはこちらです: https://stackoverflow.com/a/45139132/317284
正確でシンプルなソリューションは、setFocusable falseとsetFocusableInTouchMode trueです。そのため、EditTextは、ユーザーがそのEditTextにタッチしたときにのみフォーカスを取得します
Android:focusable="false"
Android:focusableInTouchMode="true"
最も簡単な方法は追加することです
Android:windowSoftInputMode="stateAlwaysHidden|adjustPan"
manifest.xmlファイルのアクティビティタグ内
Android:focusable="false"
を使用して無効にすることもできますが、何らかの理由でそれが機能しない場合は、LinearLayout
を配置するだけで、レイアウトを中断することなくフォーカスを取得できます。
注:Eclipseには、LinearLayout
には内容がないため役に立たないというエラーが表示されます。問題なく無視できるはずです。
例えば:
<LinearLayout
Android:focusable="true"
Android:focusableInTouchMode="false"
Android:layout_width="0dp"
Android:layout_height="0dp"
/>
<EditText
Android:id="@+id/password"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_below="@+id/changePass"
Android:layout_centerHorizontal="true"
Android:layout_marginTop="167dp"
Android:ems="10"
Android:imeOptions="flagNoExtractUi"
Android:inputType="textPassword"
Android:maxLength="30" >
</EditText>
</LinearLayout>
<activity
Android:name=".MainActivity"
Android:windowSoftInputMode="stateAlwaysHidden" />
Android:windowSoftInputMode = "stateAlwaysHidden"
この行をManifest.xmlファイルのアクティビティタグに追加します。EditTextをクリックすると、キーボードがフォーカスされます。
マニフェストで、下のコードをコピーして貼り付けます。
<activity
Android:name=".LoginActivity"
Android:windowSoftInputMode="stateAlwaysHidden"/>
1)最も簡単なマニフェストを開き、アクティビティタグの間に次のコードを挿入します。
Android:windowSoftInputMode="stateHidden"
2)この属性を親レイアウトに配置します
Android:focusable="true"
Android:focusableInTouchMode="true"
これはプログラムで行うことができます。アクティビティのeditText.setEnabled(false)
メソッドでonStart()
を使用します(onCreate()ではありません-これはGUIコンポーネントを初期化するためのメソッドであるため)