Android Webview: переопределить контекстную панель действий

Я пытаюсь переопределить контекстную панель действий в 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);
}
}

person Chan Yoong Hon    schedule 07.03.2016    source источник


Ответы (2)


Я делаю эту работу в своих старых проектах следующим образом:

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

Вы можете вносить изменения в этот код в соответствии с вашими потребностями...

person Community    schedule 07.03.2016

попробуйте выполнить следующие шаги

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);
}
person Damodhar    schedule 07.03.2016
comment
Спасибо за ваш ответ, но я не очень понимаю цель класса MyWebView. Где я определяю действие onContextItemSelected? как выполнить действие, когда я нажимаю кнопку R.id.save_word? - person Chan Yoong Hon; 07.03.2016
comment
нам нужно перезаписать длинный щелчок веб-представления, поэтому я настроил веб-представление в вашей деятельности, просто перезапишите @Override public boolean onContextItemSelected (элемент MenuItem) { switch (item.getItemId()) { case R.id.save_word: Toast. makeText(CheckDictionary.this,Сохранить значение слова успешно,Toast.LENGTH_LONG).show(); ломать; по умолчанию: перерыв; } если (mActionMode != null) { mActionMode.finish(); } вернуть super.onContextItemSelected(item); } - person Damodhar; 07.03.2016
comment
Но не работает для меня. Ошибка возникает на registerForContextMenu(mwv); - person Chan Yoong Hon; 07.03.2016
comment
перейдите по этой ссылке разработчику .android.com/intl/es/reference/android/app/ и позвольте мне перепроверить, почему это пришло, спасибо - person Damodhar; 07.03.2016
comment
Но я до сих пор не могу понять MyWebView mwv = (MyWebView) findViewById(R.id.mwv); Для R.id.mwv это идентификатор веб-просмотра в макете. Может быть синтаксическая ошибка. Это объект для идентификатора веб-просмотра. Если он объявляется объектом MyWebView, он может иметь синтаксическую ошибку. Спасибо за дополнительные пояснения. - person Chan Yoong Hon; 07.03.2016