1

我试图覆盖Android的web视图上下文操作栏。当我长时间点击选定的单词时,会显示自定义操作栏。但是,当我点击操作栏按钮时,没有任何反应。的Android网页视图:覆盖语境操作栏

这似乎是onContextItemSelected()功能不叫。这是我的代码:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.dictionary); 
    mWebView = (WebView) findViewById(R.id.wv); 
} 

@Override 
public boolean onContextItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.save_word: 
      Toast.makeText(CheckDictionary.this,"Save Word Meaning Successfully",Toast.LENGTH_LONG).show(); 
      break; 
     default: 
      break; 
    } 
    if (mActionMode != null) { 
     mActionMode.finish(); 
    } 
    return super.onContextItemSelected(item); 
} 

@Override 
public void onActionModeStarted(ActionMode mode) { 
    if (mActionMode == null) { 
     mActionMode = mode; 
     mode.setTitle("Save Word Meaning"); 
     Menu menu = mode.getMenu(); 
     menu.clear(); 
     mode.getMenuInflater().inflate(R.menu.dictionary_menu, menu); 
    } 
    super.onActionModeStarted(mode); 
} 

@Override 
public void onActionModeFinished(ActionMode mode) { 
    mActionMode = null; 
    super.onActionModeFinished(mode); 
} 
} 

回答

1

我做这个工作在我的老项目,如DIS: -

private String[] data = {"1", "2", "3", "4", "5", "6", "7", "8", "9","10"}; 

private SelectionAdapter mAdapter; 

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

    mAdapter = new SelectionAdapter(this, 
       R.layout.row_list_item, R.id.textView1, data); 
    setListAdapter(mAdapter); 
    getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); 

    getListView().setMultiChoiceModeListener(new MultiChoiceModeListener() { 

     private int nr = 0; 

     @Override 
     public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 
      // TODO Auto-generated method stub 
      return false; 
     } 

     @Override 
     public void onDestroyActionMode(ActionMode mode) { 
      // TODO Auto-generated method stub 
      mAdapter.clearSelection(); 
     } 

     @Override 
     public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
      // TODO Auto-generated method stub 

      nr = 0; 
      MenuInflater inflater = getMenuInflater(); 
      inflater.inflate(R.menu.contextual_menu, menu); 
      return true; 
     } 

     @Override 
     public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
      // TODO Auto-generated method stub 
      switch (item.getItemId()) { 

       case R.id.item_delete: 
        nr = 0; 
        mAdapter.clearSelection(); 
        mode.finish(); 
      } 
      return false; 
     } 

     @Override 
     public void onItemCheckedStateChanged(ActionMode mode, int position, 
       long id, boolean checked) { 
      // TODO Auto-generated method stub 
      if (checked) { 
        nr++; 
        mAdapter.setNewSelection(position, checked);      
       } else { 
        nr--; 
        mAdapter.removeSelection(position);     
       } 
       mode.setTitle(nr + " selected"); 

     } 
    }); 

    getListView().setOnItemLongClickListener(new OnItemLongClickListener() { 

     @Override 
     public boolean onItemLongClick(AdapterView<?> arg0, View arg1, 
       int position, long arg3) { 
      // TODO Auto-generated method stub 

      getListView().setItemChecked(position, !mAdapter.isPositionChecked(position)); 
      return false; 
     } 
    }); 
} 

private class SelectionAdapter extends ArrayAdapter<String> { 

    private HashMap<Integer, Boolean> mSelection = new HashMap<Integer, Boolean>(); 

    public SelectionAdapter(Context context, int resource, 
      int textViewResourceId, String[] objects) { 
     super(context, resource, textViewResourceId, objects); 
    } 

    public void setNewSelection(int position, boolean value) { 
     mSelection.put(position, value); 
     notifyDataSetChanged(); 
    } 

    public boolean isPositionChecked(int position) { 
     Boolean result = mSelection.get(position); 
     return result == null ? false : result; 
    } 

    public Set<Integer> getCurrentCheckedPosition() { 
     return mSelection.keySet(); 
    } 

    public void removeSelection(int position) { 
     mSelection.remove(position); 
     notifyDataSetChanged(); 
    } 

    public void clearSelection() { 
     mSelection = new HashMap<Integer, Boolean>(); 
     notifyDataSetChanged(); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View v = super.getView(position, convertView, parent);//let the adapter handle setting up the row views 
     v.setBackgroundColor(getResources().getColor(android.R.color.background_light)); 


     if (mSelection.get(position) != null) { 
      v.setBackgroundColor(getResources().getColor(android.R.color.holo_blue_light); 

     } 
     return v; 
    } 
} } 

您可以根据您的需要对此代码进行更改...

0

尝试以下步骤

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); 
} 
+0

感谢您的回复,但我不太了解MyWebView类的用途。我在哪里人onContextItemSelected的行动?当我点击按钮R.id.save_word时执行操作? –

+0

我们需要覆盖web视图的longclick,这是什么为什么我定制您的活动中的web视图只是覆盖@Override public boolean onContextItemSelected(MenuItem item){ switch(item.getItemId()){ case R.id. save_word: Toast.makeText(CheckDictionary.this, “保存词义成功”,Toast.LENGTH_LONG).show(); 休息; 默认值: break; } 如果(mActionMode!= NULL){ mActionMode.finish(); } return super.onContextItemSelected(item); } –

+0

但是不适合我。该错误出现在registerForContextMenu(mwv); –