繁体   English   中英

Android Webview:覆盖上下文操作栏

[英]Android Webview: Override Contextual Action Bar

我正在尝试覆盖 Android Webview 中的上下文操作栏。 当我长按选定的单词时,会显示自定义操作栏。 但是,当我单击操作栏按钮时,没有任何反应。

似乎没有调用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);
}
}

我在这样的旧项目上做这项工作:

 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;
     }
 } 

您可以根据需要更改此代码...

尝试以下步骤

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM