この問題は、のAndroid 6.0のSamsungデバイスでのみ発生します。 Android 6.0以降のSamsungデバイス、Android 5.1以降のSamsungデバイスなど、他のすべてのデバイスで正常に動作しています。Samsung Marshmallow 6.0デバイスの開始インデックス値を返すtextView.getSelectionEnd()
現在、私たちはAndroid 6.0搭載のデバイスをすぐに確認することはできませんが、すぐに手配しています。
我々はこれを使用している機能:
ユーザー長いのTextView内の文章から単語を押圧して、ユーザーが選択した単語を編集することができます。
- のTextViewの選択を作成し、LongClickListenerを追加:
は、我々はによってこれを実現します。
- カスタムの選択アクションモードコールバックを追加し、onCreateActionMode()をオーバーライドしてfalseを返します。これは、デフォルトのカットコピー・ペーストアクションモードを必要としないためです。
- 正確に選択された単語を取得し、その単語を修正して置き換えるUIを提供するためにonLongClickListenerを処理します。終了インデックスの代わりに開始インデックスの値を返します正しい開始インデックスが、をtextView.getSelectionEnd()を返す
textView.getSelectionStart():
問題我々が直面しています。開始インデックスと終了インデックスが同じであれば、スペースが選択され、無視されるので、Android 6.0以上のSamsungデバイスのすべての単語選択は無視され、機能が失敗するというガード条件があります。
我々がしようとしたもの:
- 私たちは、ページAndroid 6.0 Changesの "テキスト選択" セクションで述べたが、それは助けをdidn`tのようActionMode.Callback2 でActionMode.Callbackを交換してみましたこの 問題を修正しています。
- テキスト選択、クリップボードなどに関連して利用可能な追加のSamsung設定を検索しようとしましたが、運はありません。私はこれが不自由な選択肢かもしれないが、私はSamsung Touchwizでチャンスを取らないことを知っている。私は0.5から2.0秒の範囲のタッチ選択の遅延を変更する設定を見つけました。
コードスニペット:
tvText.setCustomSelectionActionModeCallback(new ActionMode.Callback() {
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
return false; // true = create the ActionMode
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
return false;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
}
});
tvText.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
final TextView textView = (TextView) v;
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
//This works correct on all devices with Android 6.0
int startIndex = textView.getSelectionStart();
//This works wrong on Samsung devices with Android 6.0, result is same as getSelectionStart()
int endIndex = textView.getSelectionEnd();
//The guard condition where we ignore the empty selections
if ((endIndex - startIndex) <= 0) {
return;
}
// Do bunch of things to UI like applying some different foreground colors to the selected word, striking out selected word etc.
}
}, TEXT_LONG_PRESS_DELAY);
return false;
}
});
のTextViewとそれ `sのスタイルのためのXMLコード:
<TextView
android:id="@+id/tvText"
style="@style/StyleChatBubbleText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="2dp"/>
<style name="StyleChatBubbleText">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:textSize">16dp</item>
<item name="android:textColor">@color/text_black</item>
<item name="android:textIsSelectable">true</item>
<item name="typeface">roboto_regular</item>
この問題に関するすべてのヘルプは大歓迎です。
質問を正しく実行しましたか?まず、問題はすべてのAndroid 6.0デバイスではありません。次に、どちらの場合も、コンテキストアクションバーもフローティングツールバーも必要ありません。必要なUI変更が適切に行われ、処理されます。問題は、APIコールが間違った結果を返すことです。 – binaryKarmic
ええ、サムスンは少しカスタマイズする傾向があります。したがって、デフォルトの実装でチェックする方が良いでしょう。この問題は、SamsungデバイスのAndroid 6デバイスで発生し、Samsungデバイスのデフォルト実装を使用しようとしています。任意の方法でフローティングツールバーのUIをカスタマイズすることができます。考えられる原因は、ActionmodeがSamsungのカスタマイズと組み合わされて作成されていないためです。 – NIPHIN
デフォルト実装ではどういう意味ですか? 問題は、フローティングツールバーのカスタマイズに関するものではありません。実際には、フローティングツールバーは必要ありません。 正しい値を返すtextView.getSelectionEnd()が必要です。 – binaryKarmic