web-dev-qa-db-ja.com

requestFocusがEditTextに対して正しく機能しない

問題を解決するために多くの時間が費やされ、それは簡単に見えますが、私は本当に疲れていて、解決策を見つけることができませんでした。アクティビティがあり、アクティビティには4つのEditTextコンポーネントがあり、そのうちの2つにはリストを含むポップアップメニュー(AlertDialog)があり、次の1つは編集が無効になっており、最後の1つは編集可能であり、ユーザーがそれをタップします。

また、私のルートLinearLayoutには、RelativeLayout内に含まれるLinearLayoutがあります。最後はAdvBannerの必要性です。最後のLinearLayout(RelativeLayout)は、ルートレイアウトの下部に配置されます。

それを説明するXMLの部分:

  <LinearLayout
      Android:layout_width="fill_parent"
      Android:layout_height="fill_parent"
      Android:layout_gravity="bottom"
      Android:focusable="false"
      Android:focusableInTouchMode="false" 
      Android:gravity="bottom">
  <RelativeLayout 
      Android:id="@+id/AdvLayoutReserveArea" 
      Android:layout_width="fill_parent" 
      Android:layout_height="50dp" 
      Android:background="#FFFFFF"
      Android:focusable="false"
      Android:focusableInTouchMode="false" 
      Android:gravity="bottom" /> 
  </LinearLayout>

アクティビティが開始されると、編集可能なEditTextにフォーカスがあり、[〜#〜] green [〜#〜]境界線があり、カーソルが点滅しています。残り数秒後、AdvBannerがロードされ、表示されます。それが起こると、編集可能なEditTextはフォーカスを失いました。この瞬間から、私の人生は悪夢のようになります。

ステップバイステップで見てみましょう。

問題1。この瞬間(Advがロードされて表示されたとき)ユーザーがソフトキーボードを介してEditTextフィールドを編集している場合、フォーカスが失われ、境界線が[〜#〜]灰色[〜#〜]色。ユーザーがテキストを入力し続けても結果はありません-記号は印刷されません(EditTextのカーソルが失われすぎます)。

テキストを入力しているときにカーソルが非アクティブになっていると、ユーザーがイライラするだろうと思います。バックグラウンドで一部のadvが読み込まれ、自分自身にフォーカスが移るからです。

これを解決するために、Advがロードされたときのメソッド(表示)で、requestFocusメソッドを使用して手動でEditTextにバックフォーカスしようとします。

public void onAdLoaded() 
    {
// TODO Auto-generated method stub
// add app specific code for this event here...
// called when an ad is successfully displayed on device            
    CountEdit1.requestFocus();
}

はい、カーソルはEditTextフィールドに戻ります。ソフトキーボードがアクティブな場合でも、ユーザーはテキストを入力できますが、EditTextフィールドの境界線は灰色のままです...

注:実際には、フォーカスされたEditTextのGREENとGRAYの境界線の違いについてはわかりません。GREENは通常、ユーザーがタップしているときであり、GRAYはおそらくフォーカスを要求するときです。手動で(requestFocus()などを使用)

問題2。(溶媒和問題#1の結果)。ソフトキーボードを閉じた後、ユーザーが編集可能なEditTextフィールドをタップすると、フォーカスが移動してカーソルが内部に表示されますが、ソフトキーボードを再度表示しても反応はありません。それをタップするとソフトキーボードは表示されませんが、コピーモードの編集フィールドのように見えます-ユーザーがテキストを選択してクリップボードにカット/コピーできる場合。

私の目標は一見簡単です。ソフトキーボードが表示され、ユーザーがテキストを入力しているときに、カーソルを保存して編集可能なEditTextフィールド(CountEdit1)にフォーカスしたいだけです。そして、ユーザーがEditTextをタップしたときの通常の反応-いつものように、ソフトキーボードを見せてください!

ここですべての問題を読み、さまざまなメソッド(clearFocus、requestFocusFromTouchなど)を組み合わせましたが、これを解決するために試みたすべてのことを説明するのに十分な時間とスペースがありませんでした。主な問題は上記のとおりです。

助けと問題の解決を願っています...よろしくお願いします。

13
Dimon

目標は解決され、回避策は私が思っていたよりも簡単です。問題#2は、onClick()メソッドを使用して修正されています。 clearFocus()メソッドとrequestFocus()メソッドの両方を使用するソフトキーボードが表示されるための十分条件。

   CountEdit1.setOnClickListener(new OnClickListener() {

      @Override
      public void onClick(View v)
      {
              CountEdit1.clearFocus();
        CountEdit1.requestFocus();
      }
    });

ユーザーがEditTextフィールドをタップすると、ソフトキーボードが表示されます。修繕。

17
Dimon

私のために働く:

InputMethodManager mgr = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
editField.requestFocus();
mgr.showSoftInput(editField, InputMethodManager.SHOW_IMPLICIT);
7
iBog
userInput.post(new Runnable() {
            public void run() {
                userIdInput.requestFocus();

            }
        });

これを試して、問題がまだ解決されていないかどうかを確認してください。

5
Swayam

ビューがフラグメントまたはアクティビティで作成された後、フォーカスを要求する必要があります。

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    CountEdit1.requestFocus();
}
1
zYberIs

これを試して:

public void onAdLoaded() 
    {  
  final Handler handler = new Handler();
             handler.postDelayed(new Runnable() {
                 @Override
                 public void run() {
                     CountEdit1.requestFocus();
                     InputMethodManager mgr = (InputMethodManager) base.getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
                     mgr.showSoftInput(CountEdit1, InputMethodManager.SHOW_IMPLICIT);
                     CountEdit1.setSelection(CountEdit1.getText().length());
                 }
             },0);
}
1
Irshu