5

私は現在、長時間押されたときに ContextMenu を表示するカスタム WebView を取得しようとしています。デフォルトの WebView クラスは、リンクが longPressed の場合にのみ ContextMenu を表示するため、この動作をオーバーライドする独自のクラスを作成しました。

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 を長押ししても何も起こりません。ContextMenu を表示するには、onLongPress() から何を呼び出す必要がありますか?

4

4 に答える 4

4

ggr44 の提案に基づいて、現在動作しています。アクティビティに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);
}
于 2011-02-03T12:05:28.643 に答える
2

ビューからアクティビティにアクセスする代わりに、ビューでインターフェイスを使用し、アクティビティからそのインターフェイスを実装することをお勧めします。

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:
    }
}
于 2013-04-08T17:36:18.873 に答える
1

onLongPress で Activity.openContextMenu(View v) を呼び出します。ただし、これは MyWebView がアクティビティへの参照を保持することを意味します。

于 2011-02-03T02:35:24.747 に答える
0

エミュレーターで何かを長押しするには、実際の通常の 1-2 秒とは対照的に、5-7 秒のように、多くのプレスが必要であることに気付きました。少なくとも 10 秒間押してください。そうしないと、何も起こらないように見えます。

于 2012-05-27T11:07:26.950 に答える