2017-07-10 3 views
-1

私は問題を抱えています。他のスレッドの他のケースと同じように、私のeditTextの位置はlistViewの上にあります。editText.requestFocusは

そして今、私は(adapter.notifyDataSetChanged経由 更新リストビューデータの後EDITTEXTにrequestFocustする方法、問題を抱えています)。 ?

私はここのrequestFocusコードを置く:doAddToList内部

editText.setOnKeyListener(new View.OnKeyListener() 
     { 
      public boolean onKey(View v, int keyCode, KeyEvent event) 
      { 
       if (event.getAction() == KeyEvent.ACTION_DOWN) 
       { 
        switch (keyCode) 
        { 
         case KeyEvent.KEYCODE_ENTER:{ 
          adapter.notifyDataSetChanged(); 
          getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); 

          return true; 
         } 
         default:{ 
          break; 
         } 
        } 

        editText.setFocusableInTouchMode(true); 
        editText.requestFocus(); 
        System.out.println("FOCUS GET"); 
       } 
       return false; 
      } 
     }); 

を最後のコードがadapter.notifyDataSetChangedされる();. System.out.printlnの結果はコンソール上で "FOCUS GET"を何回か表示しますが、フォーカスはEditTextを取得しません。

+0

コードを更新してください。どこで&どのようにあなたの呼び出しnotifyDataSetChanged() – Rahul

+0

私はすでに完全なコードではなく私のコードを更新するが、私はすでに私の問題を説明するのに十分だと思います。 – Patrick

+0

あなたの全体的なアプローチは間違っています。 editTextのkeyListenerでeditTextにフォーカスを設定しています。フォーカスがないと、keyListenerは決して起動しません。私はあなたの問題だと思っています。あなたの答えを更新し、あなたが達成しようとしているものを書いてください。その後、別の解決方法を教えてください。 – Rahul

答えて

1

あなたはonKeyListenerにrequestFocusを追加しています。まず最初に、Androidのキーボードのほとんどがキーイベントを送信します(ほとんどの場合、より高いレベルのAPIを使用します)ので、おそらく起動しません。ハードウェアボタンのみが常にキーイベントを送信します。第2に、たとえキーボードがキーイベントを送信したとしても、それは既に開いていなければならず、その行を実行するためにタイプします。

notifyDataSetChangedが呼び出されるたびにフォーカスを設定する場合は、notifyDataSetChangedを呼び出すたびにsetFocusを呼び出します。それをあなたがどこに置いても、それはまさに正しいものではなく、私はあなたの論理を考え出すことができません。

+0

ちなみに、私はnotifyDataSetChangedのrequestFocusを書きます。私のポストにもう一度見てください。 – Patrick

+0

アイデアのコードサンプルを共有できますか? – Patrick

+0

あなたはしませんでした。あなたはキーリスナーの内部にあります。これは完全に無関係の機能です(とにかくあなたが思うことをしないかもしれません)。 –

2

notifyDataSetChanged()を呼び出すと、多くの処理が行われるため、editText.requestFocus()への呼び出しが無視される理由が考えられます。

はnotifyDataSetChanged(後にこのコードを使用してみてください)EDIT

recyclerView.post(new Runnable() { 
    @Override 
    public void run(){ 
     editText.requestFocus(); 
    } 
}); 

OR

editText.post(new Runnable() { 
    @Override 
    public void run(){ 
     editText.requestFocus(); 
    } 
}); 

を呼び出します。(あなたの必要性につきとしての遅延時間を調整します)試してみてください -

recyclerView.postDelayed(new Runnable() { 
@Override 
public void run(){ 
    editText.requestFocus(); 
} 

}、 1000)。

希望します。

+0

コードの仕組みを説明できますか?とにかくありがとうございました。 – Patrick

+0

多くの並列処理が行われている場合、リソースが限られているため、アンドロイドはいくつかのメソッド呼び出しを無視するようです。 Post()メソッドは、コードブロックをキューに入れて、1つずつ実行します。詳細については、ドキュメンテーションを参照してください。これで問題が解決した場合は、回答として – Rahul

+0

をマークしてください。私はすでにあなたのソリューションを試していますが、動作していません。他の解決してください?ありがとうございました – Patrick

関連する問題