私はAndroidに2つの要素を持つActivity
を持っています。
EditText
ListView
私のActivity
が起動すると、EditText
はすぐに入力フォーカスを取得します(カーソルの点滅)。起動時にコントロールに入力フォーカスを設定したくありません。私は試した:
EditText.setSelected(false);
運がありません。 EditText
の開始時にActivity
が自分自身を選択しないようにするにはどうすればよいですか。
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"/>
実際に問題になっているのは、まったく焦点を合わせたくないということですか。それともEditText
にフォーカスした結果として仮想キーボードを表示させたくないですか? EditText
が起動時にフォーカスしているという問題は実際には見られませんが、ユーザーがEditText
にフォーカスすることを明示的に要求しなかった場合(その結果としてキーボードを開いた場合).
それが仮想キーボードの問題である場合は、AndroidManifest.xml
<activity>要素 のドキュメントを参照してください。
Android:windowSoftInputMode="stateHidden"
- アクティビティに入るときは常に隠します。
またはAndroid:windowSoftInputMode="stateUnchanged"
- 変更しないでください(例:don't show itがまだ表示されていない場合は、開いていた場合は開いたままにしてください)。
もっと簡単な解決策があります。親レイアウトにこれらの属性を設定します。
<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に感謝します。
私が見つけた唯一の解決策は:
Android:focusable="true"
とAndroid:focusableInTouchMode="true"
を設定しますそしてEditText
は活動を始めた後に焦点を当てません
問題は私がレイアウトの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>
他のポスターから提供された情報を使用して、私は次の解決策を使用しました。
レイアウト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();
}
setSelected(false)
の代わりに clearFocus() を試してください。 Androidのすべてのビューはフォーカス可能性と選択可能性の両方を持っています、そしてあなたはただフォーカスをクリアしたいと思います。
次は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を返している、すなわちイベントを消費していないので、フォーカシングの振る舞いは通常通り進行します。
私はいくつかの答えを個別に試してみましたが、焦点はまだ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 )
この解決策のどれも私のために働きませんでした。オートフォーカスを修正する方法は次のとおりです。
<activity Android:name=".Android.InviteFriendsActivity" Android:windowSoftInputMode="adjustPan">
<intent-filter >
</intent-filter>
</activity>
簡単な解決策: AndroidManifest
タグ内のActivity
内
Android:windowSoftInputMode="stateAlwaysHidden"
"focusable" および "タッチモードでフォーカス可能" を、TextView
の最初のlayout
でtrueに設定するだけです。このようにして、アクティビティが開始されるとTextView
がフォーカスされますが、その性質上、画面にフォーカスされたものは何も表示されず、もちろん no キーボードが表示されます。
以下はManifest
で私のために働きました。書きます 、
<activity
Android:name=".MyActivity"
Android:windowSoftInputMode="stateAlwaysHidden"/>
最も単純な答えは、これをXMLの親レイアウトに追加するだけです。
Android:focusable="true"
Android:focusableInTouchMode="true"
私はプログラム的にすべての分野から焦点を明確にする必要がありました。メインのレイアウト定義に次の2つのステートメントを追加しました。
myLayout.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
myLayout.setFocusableInTouchMode(true);
それでおしまい。即座に私の問題を修正しました。シルバー、私を正しい方向に向けてくれてありがとう。
Android:windowSoftInputMode="stateAlwaysHidden"
ファイルのactivityタグにManifest.xml
を追加します。
あなたがListView
のようなあなたの活動について別の見方をしているならば、あなたもすることができます:
ListView.requestFocus();
あなたのonResume()
でeditText
からフォーカスを取得します。
私はこの質問が答えられたことを知っていますが、私のために働いた代替ソリューションを提供するだけです:)
最初の編集可能フィールドの前にこれを試してください。
<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();
onCreate
メソッドに以下を追加します。
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
機能に関連するもので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;
}
遅くなりましたが、おそらく役に立ちました。レイアウトの一番上にダミーのEditTextを作成し、myDummyEditText.requestFocus()
の中でonCreate()
を呼び出します。
<EditText Android:id="@+id/dummyEditTextFocus"
Android:layout_width="0px"
Android:layout_height="0px" />
それは私の期待通りに振る舞うようです。設定の変更などを処理する必要はありません。長いTextView(手順)を使用してActivityにこれを必要としました。
この行を親レイアウトに書きます...
Android:focusableInTouchMode="true"
うん私も同じことをした - 最初の焦点を取得する「ダミー」の線形レイアウトを作成します。さらに、「次の」フォーカスIDを設定して、ユーザーが一度スクロールした後にそれ以上フォーカスできなくなるようにします。
<LinearLayout 'dummy'>
<EditText et>
dummy.setNextFocusDownId(et.getId());
dummy.setNextFocusUpId(et.getId());
et.setNextFocusUpId(et.getId());
ビューへのフォーカスを取り除くための多くの作業
ありがとう
私にとって、すべてのデバイスでうまくいったのはこれです。
<!-- 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" />
これを問題のある集中的なビューの前にビューとして配置するだけです。
これは完璧で最も簡単な解決策です。私はいつもこれを私のアプリで使用しています。
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
私がした最も簡単なことはonCreateで別のビューに焦点を合わせることです:
myView.setFocusableInTouchMode(true);
myView.requestFocus();
これによりソフトキーボードの起動が停止し、EditTextにカーソルが点滅しなくなりました。
<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"/>
キーボードを開かないManifest
のActivity
ファイル内にこのコードを書いてください。
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>
あなたのアクティビティのonCreate
で、あなたのEditText要素にuse clearFocus()
を追加するだけです。例えば、
edittext = (EditText) findViewById(R.id.edittext);
edittext.clearFocus();
また、フォーカスを別の要素に変更したい場合は、その上でrequestFocus()
を使用してください。例えば、
button = (Button) findViewById(R.id.button);
button.requestFocus();
キーボードを隠す最も簡単な方法はsetSoftInputModeを使うことです
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
または、InputMethodManagerを使用してこのようにキーボードを隠すこともできます。
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);
アクティビティを開くと、キーボードが自動的に表示され、EditTextにフォーカスが移動します。 manifest.xmlファイルのactivityタグに次の行を書き込むことでキーボードを無効にできます。
Android:windowSoftInputMode="stateAlwaysHidden|adjustPan"
これを実現するには、レイアウトの幅と高さを0dp
に設定したダミーのEditText
を作成し、そのビューにフォーカスを要求します。
<EditText
Android:id="@+id/editText0"
Android:layout_width="0dp"
Android:layout_height="0dp"
Android:hint="@string/dummy"
Android:ems="10"
>
<requestFocus />
</EditText>
XmlのEditText
タグから"<requestFocus />"
という行を必ず削除してください。
<EditText
Android:id="@+id/input"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content">
<requestFocus /> <!-- remove this line -->
</EditText>
次のコードを使用して、ボタンが押されたときに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 であるのでこれは私にとってはうまくいくので、表示されているかどうかは関係ありません。
それを隠してそれを連続して見せて、それが焦点を失うのに役立つかどうかを確かめることができます。
/**
* 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);
}
}
}
View current = getCurrentFocus();
if (current != null)
current.clearFocus();
最も簡単な方法は、 Manifest.xml ファイルのactivityタグにAndroid:windowSoftInputMode="stateAlwaysHidden"
を追加することです。
EditText
内のListView
は正しく機能しません。 TableLayout
を使用している場合は、自動的に生成された行でEditText
を使用することをお勧めします。
やってみる
edit.setInputType(InputType.TYPE_NULL);
edit.setEnabled(false);
私はこのような問題を抱えていました、そしてそれは私の選択者のせいでした。最初の状態は、それが一致し使用した最初の状態だったので、フォーカス状態になったという私の見方が無効であってもフォーカスでした。次のように最初の状態を無効に設定できます。
<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"/>
<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"/>
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()でも試してください:)
Request focusを使用してキーボードの非表示コードを使用することで、他のウィジェットにフォーカスを指定できます。
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>`
これをして、あなたの仕事を成し遂げましょう!
Android:focusable="true"
Android:focusableInTouchMode="true"
あなたは編集テキストとリストを持っています。 OnStart/On Createでは、リストビューにフォーカスを設定する必要があります。Listview.requestfocus()
アクティビティの開始時にキーボードを隠したい場合それから言及
Android:windowSoftInputMode = "stateHidden"
マニフェストファイルのそのアクティビティに。問題は解決します。
乾杯。
送信ボタンですべてのフォーカスをクリアします
// 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
}
});
これがあなたのお役に立てば幸いです:)
あなたの活動について述べたマニフェストファイルの下の行を追加
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" />