質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

2回答

4324閲覧

EditText カーソルの移動

hijiri

総合スコア61

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2016/11/14 01:36

###質問
EditTextに文字が入力されている場合、その文字列のタッチした場所にカーソルが移動します。

そのカーソルが移動するというコードはどのように書かれているのでしょうか?

###試したこと
getSelectionやsetSelectionを使う場合、押した文字列の位置が前から何番目の文字であるかを取得しなければなりません。
文字列の大きさが常に一定であれば、押した座標を取得して、
○<X<△ (X座標が○~△の間であるならば)
EditText.setSelection(i) (i番目にカーソルを移動)

という風に書けると思うのですが、EditTextのsinglelineがtrueになっていて、文字列が画面に収まりきらず横スクロールの場合、x座標を取得して決まった位置にカーソルを移動させるという方法ではうまくカーソルが移動しません。

どうすればいいでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

自分もそこまでの実装はしたことがないですが、
EditTextの標準で搭載している文字位置の認識では駄目ということでしょうか?

等幅フォントを使用すれば位置は特定できると思うのですが、フォント変更はできないのでしょうか?

投稿2016/11/14 05:13

himakuma

総合スコア952

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hijiri

2016/11/14 09:51

標準搭載されている文字認識で大丈夫なのですが、EditTextをタップすると、カーソルが移動すると共にソフトキーボードが表示されてしまいますよね? そのソフトキーボードは表示せずにカーソル移動のみ行いたいのです。 また、EditTextをロングタップしたり、ダブルタップすると、切り取り・貼り付けなどのアクションがでてきますよね。この場合も、切り取り・貼り付けなどのアクションは一切動作させずに、カーソルのみ動かしたいのです。 ですので、EditTextにオンタッチリスナー(ACTION_DOWN)を設定して、その中にカーソルを移動させるコードを書き、最後にreturn trueを返すことでソフトキーボードを表示させず、切り取り・貼り付けなどのアクションも起こさせず、カーソルのみ移動させたいと考えているのです。 ですので、EditTextの大元のコードを見れば、そこにカーソル移動のコードが記述されているのでは?と考えたのですが、EditTextでCtrl+Bでコードを見たのですが、よく理解できません・・・
himakuma

2016/11/14 10:19

EditTextのクラス自体はJavaで実装はされていなかったように記憶しています。クラスに飛んでもメソッドの定義しかされていない気がします。
himakuma

2016/11/14 10:23

すいません、仕様の質問になってしまうのですが、入力ができないEditTextってことですか?
hijiri

2016/11/14 11:55

そうなんです、 カーソルに関連しそうな部分のコードを探してみたのですが、 public void setSelection(int start, int stop) { throw new RuntimeException("Stub!"); } public void setSelection(int index) { throw new RuntimeException("Stub!"); } とあって、理解が出来ません・・・親要素がText Viewですから、そちらも紐解かなければいけないのでしょうかね・・・ 仕様としては、入力できないけど、カーソルは表示されていて文字列のタップした位置にカーソルが移動するEditText ということです!
himakuma

2016/11/14 12:25

編集不可にするだけで、できませんか?
hijiri

2016/11/15 09:17

編集不可といいますと、XMLにてEditTextのeditable をfalseにするということでしょうか?
himakuma

2016/11/15 09:28

editText.setKeyListener(null);とかはどうでしょう?
hijiri

2016/11/15 11:12

editText.setKeyListener(null); の場合も、editableをfalseにした場合と同様、ソフトキーボードは表示されなくなるし、ロングタップもダブルタップも反応はしなくなるのですが、カーソルも消えてしまいます・・・ カーソルだけは、普段のEditTextの様に動作して欲しいのです・・
himakuma

2016/11/15 13:24

バージョンはなんですか?
hijiri

2016/11/15 13:48

バージョンとは、androidのバージョンでしょうか? 最低APIレベル21、Lollipopからの仕様になっております。 androidstudioのバージョンは、2.1.3です。
guest

0

フォントは一般的に文字によって1文字の幅が違いますし段落ごと行ごとに文字の高さが違う場合もありますね。こういったことを含め、編集中のテキスト(=文字列)をコントロールがどの位置に描画しているのかを縦横のスクロール位置や文字毎の高さや横幅を含めて画面上の画素(ピクセル)の単位で計算しているということになります。

計算方法はテキストのコントロールの属性や状態に影響を受けるため結構複雑なものになりますが計算可能であることは想像できると思います。

投稿2016/11/14 05:10

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hijiri

2016/11/14 09:53

そうですよね、ユーザーの設定によって文字の位置が全然変わってくるので難しいです・・・ ちなみに、EditTextではどのようなコードでカーソル移動させているのでしょうか?
KSwordOfHaste

2016/11/14 11:01

なるほど、内部の仕組みに興味を持ったわけではなくて実際にカーソルの移動のみをするような実装をしたかったのですね・・・自分はAndroidの開発環境がないので具体的な実装に基づいて回答したのではなくこういう仕組みでやっているという一般論を答えただけなのです。 EditTextは多くの実装がnativeメソッドになっているようなので描画位置関連の計算をしているどんな機能があるかをリファレンスやメソッドのインターフェースから詳しく解析してみないと本件の実装方法がみえてこないかも知れませんね。
hijiri

2016/11/14 12:02

そうなんです。言葉足らずで申し訳ありませんでした。 なるほど、もっと理解を深める必要があるということですね・・・ 勉強します!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問