0

私は持っていTextViewます。ロングクリックすると、ロングクリックが行われたテキストの一部が強調表示され、いくつかの追加オプションを提供するコンテキスト アクション メニューが表示されます。

ただし、テキストが強調表示されている場合、コンテキスト アクション メニューは必要なものとは異なります。一方、目的のコンテキスト アクション メニューが表示されている場合、テキストは強調表示されません。

の関数内のreturnステートメントまでゼロにすることができました。具体的には、関数が (クリックを消費する) 場合、コンテキスト アクション メニューが表示されますが、長いクリックがテキスト選択ツールに渡されなかったため、有効になりません。ただし、関数が を返す場合、クリックは関数に渡され、選択されたテキストのデフォルトの動作がトリガーされます。 onLongClickonLongClickListeneronLongClickreturns trueonLongClickfalsecopy + paste

コード:

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;

public class HelloTxtView extends Activity {

    //private EditText ed;
    private TextView ed;

    //actionmode callback.
    private ActionMode mActionMode;
    private ActionMode.Callback mActionModeCallback;

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

        ed = (TextView) findViewById(R.id.txtview);
        ed.setFocusable(true);
        ed.setText("Hello World! Let's select some text!!");

        initActionModeCallbacks();

        ed.setOnLongClickListener(new View.OnLongClickListener() {

            @Override
            public boolean onLongClick(View v) {
                Log.v(this.toString(), "Long click.");
                ed.setCursorVisible(true);

                Log.v(this.toString(), "Starting actionmodecallback.");
                mActionMode = HelloTxtView.this.startActionMode(mActionModeCallback);
                v.setSelected(true);

                return false;
            }
        });
    }

    public void initActionModeCallbacks() {

        /*
         * This function initializes the callbacks.
         */

        mActionModeCallback = new ActionMode.Callback() {

            @Override
            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                //nothing to do here.
                Log.v(this.toString(), "Preparing action mode.");
                return false;
            }

            @Override
            public void onDestroyActionMode(ActionMode mode) {
                Log.v(this.toString(), "Destroy action mode.");
                //mActionModeCallback = null;
            }

            @Override
            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                Log.v(this.toString(), "Creating new action mode menu.");
                //inflate a new menu.
                MenuInflater inflater = mode.getMenuInflater();
                inflater.inflate(R.menu.options_menu, menu);
                Log.v(this.toString(), "Done inflating menu.");
                return true;
            }

            @Override
            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
                Log.v(this.toString(), "An item was clicked.");
                switch(item.getItemId()) {
                case R.id.dictLookup:
                    Log.v(this.toString(), "Look up dictionary.");
                    break;

                case R.id.readFromHere:
                    Log.v(this.toString(), "Start reading from here:" + ed.getSelectionStart());
                }
                return false;
            }
        };
    }
}

私の質問:
1. のデフォルトの動作をオーバーライドするにはどうすればよいTextViewですか?
2. コンテキスト アクション メニューでテキストを選択するにはどうすればよいですか?

4

1 に答える 1

1

テキスト選択でカスタムのコンテキスト アクション モードを取得する場合は、次のようなことができます

    ed = (TextView) findViewById(R.id.txtview);
    ed.setText("Hello World! Let's select some text!!");
    initActionModeCallbacks();
    ed.setTextIsSelectable(true);
    ed.setCustomSelectionActionModeCallback(mActionModeCallback);

    ed.setOnLongClickListener(new View.OnLongClickListener() {

        @Override
        public boolean onLongClick(View v) {
            Log.v(this.toString(), "Long click.");
            ed.setCursorVisible(true);
            v.setSelected(true);

            return false;
        }
    });

また、onCreateActionMode(ActionMode モード、メニュー メニュー) で、標準の選択項目を削除する場合は、呼び出すことができます。

menu.clear();

また、メニューの項目にはSHOW_AS_ACTION_ALWAYSフラグが必要です。オーバーフローボタンが機能せず、フォーカスが変更されるためですhttps://stackoverflow.com/a/9883763/2751697

于 2013-09-21T10:30:54.610 に答える