39

ユーザーがテキストを選択し、ボタンを押してそのテキストで何かを実行できるようにするTextView(またはEditText)を表示できるようにしたいアプリがあります。Honeycombより前のAndroidバージョンでこれを実装することは問題ありませんが、Honeycomb以降では、デフォルトの長押しアクションは、コピー/切り取り/貼り付けオプションを備えたアクションバーを表示することです。長押しをインターセプトして自分のアクションバーを表示することはできますが、テキスト選択ハンドルが表示されません。

独自のActionModeを開始したら、テキスト選択ハンドルを表示するにはどうすればよいですか?

ActionModeを開始するために使用しているコードは次のとおりです。これは、テキスト選択ハンドルが表示されていない場合を除いて機能します。

public boolean onLongClick(View v) {
    if(actionMode == null)
        actionMode = startActionMode(new QuoteCallback());
    return true;
}

class QuoteCallback implements ActionMode.Callback {

    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        MenuInflater inflater = mode.getMenuInflater();
        inflater.inflate(R.menu.quote, menu);
        return true;
    }

    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        return false;
    }

    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        switch(item.getItemId()) {

        case R.id.quote:
            Log.d(TAG, "Selected menu");
            mode.finish();
            // here is where I would grab the selected text
            return true;
        }
        return false;
    }

    public void onDestroyActionMode(ActionMode mode) {
        actionMode = null;
    }
}
4

3 に答える 3

57

私は自分の質問に対する答えを見つけました。TextView (したがって、EditText) には、setCustomSelectionActionModeCallback()代わりに使用する必要があるメソッドがありstartActionMode()ます。これを使用すると、TextView がテキスト選択に使用するメニューをカスタマイズできます。サンプルコード:

bodyView.setCustomSelectionActionModeCallback(new StyleCallback());

ここで、StyleCallback は、Select All を削除し、いくつかのスタイリング アクションを追加して、テキスト選択メニューをカスタマイズします。

class StyleCallback implements ActionMode.Callback {

    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        Log.d(TAG, "onCreateActionMode");
        MenuInflater inflater = mode.getMenuInflater();
        inflater.inflate(R.menu.style, menu);
        menu.removeItem(android.R.id.selectAll);
        return true;
    }

    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        return false;
    }

    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        Log.d(TAG, String.format("onActionItemClicked item=%s/%d", item.toString(), item.getItemId()));
        CharacterStyle cs;
        int start = bodyView.getSelectionStart();
        int end = bodyView.getSelectionEnd();
        SpannableStringBuilder ssb = new SpannableStringBuilder(bodyView.getText());

        switch(item.getItemId()) {

        case R.id.bold:
            cs = new StyleSpan(Typeface.BOLD);
            ssb.setSpan(cs, start, end, 1);
            bodyView.setText(ssb);
            return true;

        case R.id.italic:
            cs = new StyleSpan(Typeface.ITALIC);
            ssb.setSpan(cs, start, end, 1);
            bodyView.setText(ssb);
            return true;

        case R.id.underline:
            cs = new UnderlineSpan();
            ssb.setSpan(cs, start, end, 1);
            bodyView.setText(ssb);
            return true;
        }
        return false;
    }

    public void onDestroyActionMode(ActionMode mode) {
    }
}

メニュー追加の XML は次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/italic"
          android:showAsAction="always"
          android:icon="@drawable/italic"
          android:title="Italic"/>
    <item android:id="@+id/bold"
          android:showAsAction="always"
          android:icon="@drawable/bold"
          android:title="Bold"/>
    <item android:id="@+id/underline"
          android:showAsAction="always"
          android:icon="@drawable/underline"
          android:title="Underline"/>
</menu>
于 2012-10-22T03:44:29.843 に答える
0

applicationこれを行う最も簡単な方法は、 のタグで定義したメイン テーマ スタイルに行を追加することですAndroidManifest。テーマ スタイルを開き、次を追加します。

<item name="actionModeBackground">@color/your_color</item>

また

<item name="android:actionModeBackground">@color/your_color</item>

例: 私が定義した私のテーマ スタイル:

<style name="AppTheme" parent="AppBaseTheme">

        <item name="calendarViewStyle">@style/Widget.Holo.CalendarView</item>
        <item name="android:actionBarStyle">@style/AppTheme1</item>
        <!-- below is the line you have to add -->
        <item name="android:actionModeBackground">@color/black_actionBar</item>
</style>
于 2016-02-11T08:16:41.117 に答える