Android: открытие ContextMenu из onLongPress в пользовательском WebView - PullRequest
5 голосов
/ 03 февраля 2011

В настоящее время я пытаюсь получить пользовательский WebView, который отображает ContextMenu при длительном нажатии.Так как класс WebView по умолчанию отображает ContextMenu только тогда, когда ссылка longPressed, я написал свой собственный класс для переопределения этого поведения:

public class MyWebView extends WebView {
    Context context;
    GestureDetector gd;

    public MyWebView(Context context, AttributeSet attributes) {
        super(context, attributes);
        this.context = context;
        gd = new GestureDetector(context, sogl);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return gd.onTouchEvent(event);
    }

    GestureDetector.SimpleOnGestureListener sogl =
                new GestureDetector.SimpleOnGestureListener() {

        public boolean onDown(MotionEvent event) {
            return true;
        }

        public void onLongPress(MotionEvent event) {
            // The ContextMenu should probably be called here
        }
    };
}

Это работает без проблем, обнаруживается longPress и вызывается метод onLongPressЯ в растерянности, когда дело доходит до отображения ContextMenu.Я попытался сделать это обычным способом в своей Деятельности:

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

    MyWebView mwv = (MyWebView) findViewById(R.id.mwv);
    registerForContextMenu(mwv);
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v,
                    ContextMenu.ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.context, menu);
}

Однако, когда я долго нажимаю MyWebView в эмуляторе, ничего не происходит.Что мне нужно вызвать из onLongPress () для отображения ContextMenu?

Ответы [ 4 ]

3 голосов
/ 03 февраля 2011

Я получил его сейчас, основываясь на предложении gngr44. Я заставил свою деятельность реализовать класс OnLongClickListener и предоставил метод onLongClick(), который открывает контекстное меню.

Пересмотренный код:

Пользовательский WebView:

public class MyWebView extends WebView {
    MyActivity theListener;
    Context context;
    GestureDetector gd;

    public MyWebView(Context context, AttributeSet attributes) {
        super(context, attributes);
        this.context = context;
        gd = new GestureDetector(context, sogl);
    }

    // This is new
    public void setListener(MyActivity l) {
        theListener = l;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return gd.onTouchEvent(event);
    }

    GestureDetector.SimpleOnGestureListener sogl =
                new GestureDetector.SimpleOnGestureListener() {

        public boolean onDown(MotionEvent event) {
            return true;
        }

        public void onLongPress(MotionEvent event) {
            theListener.onLongClick(MyWebView.this);
        }
    };
}

Моя активность:

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

    MyWebView mwv = (MyWebView) findViewById(R.id.mwv);
    registerForContextMenu(mwv);
}

public boolean onLongClick(View v) {
    openContextMenu(v);
    return true;
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v,
                    ContextMenu.ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.context, menu);
}
2 голосов
/ 08 апреля 2013

Вместо того, чтобы получать доступ к действию из вашего представления, я бы рекомендовал использовать интерфейс в вашем представлении и реализовать этот интерфейс из вашего действия.

public class MyWebView extends WebView {
    private OnLongPressListener mListener;

    public MyWebView(Context context, AttributeSet attributes) {
        mListener = (OnLongPressListener) context;
    }

    public void onLongPress(MotionEvent event) {
        mListener.onLongPress(your variables);
    }

    public interface OnLongPressListener {
        public void onLongPress(your variables);
    }
}

public class YourActivity extends Activity implements OnLongPressListener {

    @Override
    public void onLongPress(your variables) {
        // handle the longPress in your activity here:
    }
}
1 голос
/ 03 февраля 2011

Вызовите Activity.openContextMenu (View v) в onLongPress. Это будет означать, что MyWebView сохранит ссылку на Activity.

0 голосов
/ 27 мая 2012

Я заметил, что длительное нажатие на что-либо в эмуляторе требует МНОГО нажатия, например 5-7 секунд, в отличие от обычного 1-2 в реальной жизни. Убедитесь, что вы нажимаете не менее 10 секунд, иначе может показаться, что ничего не происходит.

...