2

我google了很多,並找到一些教程和答案在這裏在stackoverflow,但我面臨一些困難來解決這個問題。如何在Android中的WebView中選擇文本時覆蓋上下文操作欄?

我有一個帶有WebView的片段,當用戶選擇我的web視圖的一些文本時,我想顯示我的自定義上下文操作欄。我這裏有兩個主要問題:

  • 1目前,當用戶在Web視圖的任何部分,長按我的自定義CAB的表現。
  • 2當用戶在我的Web視圖的某些文本中執行長按操作時,未選擇文本。

我的一些當前的代碼:

自定義界面:

public class SelectActionModeCallback implements ActionMode.Callback { 

    @Override 
    public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
     return false; 
    } 

    @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) { 
    } 
} 

自定義的WebView

public class CustomWebView extends WebView { 

    private SelectActionModeCallback actionModeCallback; 

    public CustomWebView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    public ActionMode startActionMode(Callback callback) { 
     actionModeCallback = new SelectActionModeCallback(); 
     return super.startActionMode(actionModeCallback); 
    } 

在我的片段,我有這樣的:

@Override 
public void onResume() { 
    super.onResume(); 

    myWebView.setOnLongClickListener(new View.OnLongClickListener() { 
     public boolean onLongClick(View view) { 
      if (mActionMode != null) { 
       Toast.makeText(getActivity(), "test", Toast.LENGTH_SHORT).show(); 
       return false; 
      } 

      mActionMode = getActivity().startActionMode(mActionModeCallback); 
      view.setSelected(true); 
      return true; 
     } 
    }); 
} 

private SelectActionModeCallback mActionModeCallback = new SelectActionModeCallback() { 

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

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

    @Override 
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.action_sustom: 
       customMethod(); 
       mode.finish(); 
       return true; 
      default: 
       return false; 
     } 
    } 

    @Override 
    public void onDestroyActionMode(ActionMode mode) { 
     mActionMode = null; 
    } 
}; 

回答

3

有更好的方法!請參閱以下答案:https://stackoverflow.com/a/22391169/2608235


總之,不能使用 OnLongClickListener並將選擇保留在 WebView之內。 Android會在幕後選擇 WebViews內的文字,做一些奇怪的事情。如果您覆蓋 OnLongClickListener以致電 startActionMode,您將失去選擇,就像您發現的那樣。

你應該做的是改寫startActionMode在你的片段中,而不是其父View(在你的案例中,CustomWebView)。

我沒有mod權限將此問題標記爲重複,但它是。
看到我的問題了解更多信息:Use a custom contextual action bar for WebView text selection