2013-11-27 74 views
5

IMEの編集テキストでカーソル位置を設定する必要があるソフトキーボードで作業しています。Android IME、EditTextのカーソル位置を設定する

enter image description here

上記画像に示されているように、我々はいくつかのテキストを編集するテキストと(青インジケータによって示される)現在のカーソル位置に入力されて見ることができるように、私は、ソフトキーボードを作成しました。

は私はInputConnectionが設け異なる機能を試みた

(第1の画像の赤い色で示される行の最後に我々の場合)現在の行の末尾にカーソル位置を設定する必要が私は、と

CharSequence seq = conn.getTextBeforeCursor(1000, 0);  // will get as much characters as possible on the left of cursor 

そして、もう一つを試してみました、私はまた、エディットテキストの行数(我々の場合には、それは2だ)にカウントする必要があります。

答えて

2

こんにちは感謝のおかげです。 2日前に私は 解決策を得ましたが、私の答えを更新することはできません。コードの下に使用されているIについて

我々は10を超えるAPIバージョンを使用している場合、

sendDownUpKeyEvents(0x0000007b); 

この方法は、APIに追加されるため11

場合11未満のAPIバージョンを使用しています。

if (getCurrentInputConnection() != null) { 
        CharSequence textAfter = getCurrentInputConnection().getTextAfterCursor(1024, 0); 
        if (!TextUtils.isEmpty(textAfter)) { 
         int newPosition = 1; 
         while (newPosition < textAfter.length()) { 
          char chatAt = textAfter.charAt(newPosition); 
          if (chatAt == '\n' || chatAt == '\r') { 
           break; 
          } 
          newPosition++; 
         } 
         if (newPosition > textAfter.length()) 
          newPosition = textAfter.length(); 
         try { 
          CharSequence textBefore = getCurrentInputConnection().getTextBeforeCursor(Integer.MAX_VALUE, 0); 
          if (!TextUtils.isEmpty(textBefore)) { 
           newPosition = newPosition + textBefore.length(); 
          } 
          getCurrentInputConnection().setSelection(newPosition, newPosition); 
         } catch (Exception e) { 
          e.printStackTrace(); 
         } 
        } 
       } 
+0

本当に私はあなたが自動的に折り返された行を考慮しようとしていたことを理解しました。 '\ n'または '\ r'で終わった行ではなく、実際に改行が入力されました。とにかく、あなたは解決策を得てうれしい! –

3

以下は、あなたがしたいことをするための作業用コードです。

それは非常に簡単です:

最初の行の末尾にカーソル位置を設定するには、まずその行の最後のテキスト文字のインデックスを取得する必要があります。これを行うには、EditTextsのレイアウトにメソッドがあります。そうでない場合は

レイアウトはのEditTextがテキストをレイアウトするために内部で使用するものであり、それは、行の末尾にテキストインデックスを返しgetLineEndというメソッドを持っている(私たちはここから1を減算する必要があり、私たちのカーソルは次の行の先頭で終わります)。

カーソルを置く位置になったら、setSelectionのEditTextメソッドを使用します。

int endOfFirstLine = editText.getLayout().getLineEnd(0)-1; 
//set the text selection (cursor postion) to that index 
editText.setSelection(endOfFirstLine); 

我々はまた、このコードで

int lineCount = editText.getLineCount(); 

で、本当に簡単なトリックを行数を取得することができ、それはのEditTextのレイアウトが構築された後に実行しなければならないことです。つまり、これをonCreateまたはonResumeに入れるだけでは機能しません。行数は0になります。

レイアウトパスが完了したら、このコードを実行する必要があります。 edittextにレイアウト・リスナーを追加し、その完了後にコードを実行します。

editText.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
      @Override public void onGlobalLayout() { 
} 

相続人は完全なアクティビティコード:

public class MainActivity extends Activity { 

    private EditText editText; 

    @Override protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     editText = (EditText) findViewById(R.id.test_edittext); 

     editText.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
      @Override public void onGlobalLayout() { 

       //this gives us the index of the text at the end of the first line. 
       int endOfFirstLine = editText.getLayout().getLineEnd(0)-1; 
       //set the text selection (cursor postion) to that index 
       editText.setSelection(endOfFirstLine); 

       //we can get the line count with getLineCount 
       int lineCount = editText.getLineCount(); 

       Toast.makeText(MainActivity.this, "number of edittext lines: " + lineCount, Toast.LENGTH_LONG).show(); 
      } 
     }); 

    } 

    @Override protected void onResume() { 
     super.onResume(); 



    } 

} 
1

ごめんなさいあなたは文句を言わないIMEからのことを行うことができると言っています。そのためには、EditTextのいくつかのメソッドにアクセスする必要がありますが、Textviewコントロールはプロセスではなく別のアクティビティにあるため、利用可能なAPIはありません。

取得できる情報は、onStartInput(EditorInfo属性、boolean restarting)など、一部のInputMethodServiceメソッドで確認できるEditorInfoパラメータにあるものです。おそらく将来的にはもっと多くの情報にアクセスする他の方法が含まれているかもしれませんが、この時点であなたが求めていることはすべてsetSelectionメソッドのカーソル位置を変更することですが、これは最初の行の終わりの位置であるため、必要なものには本当に便利ではありません。

関連する問題