2013-03-12 18 views
27

Chcę zastąpić istniejący domyślny pasek działań kontekstowych (CAB) do zaznaczania tekstu. Chodzi mi o to, że chcę wyświetlać własne CAB z własnymi przyciskami, gdy jakiś tekst jest zaznaczony na stronie internetowej. Próbowałem wdrożyć CAB przy użyciu dokumentacji Android. OnLongClickListener nie przechwytuje zdarzenia zaznaczania tekstu w widoku internetowym. Co to jest zdarzenie przechwytujące wybór tekstu? Czy możliwe jest ukrycie domyślnego CAB i wyświetlenie CAB na zaznaczeniu tekstu?Zastępowanie domyślnego paska działań kontekstowych dla zaznaczania tekstu (w WebView) w Androidzie

childWebView.setOnLongClickListener(new OnLongClickListener() { 
     @Override 
    // Called when the user long-clicks on someView 
     public boolean onLongClick(View view) { 
      if (mActionMode != null) { 
       return false; 
      } 

      // Start the CAB using the ActionMode.Callback defined above 
      mActionMode = startActionMode(mActionModeCallback); 
      view.setSelected(true); 
      return true; 
     } 
    }); 
+0

znalazłeś rozwiązanie dla tego karka? –

+0

Nie. Nie zrobiłem tego. – arun8

+0

jakiekolwiek rozwiązanie do tej pory? – sanjeev

Odpowiedz

8

Byłem w stanie rozwiązać ten problem. Stawiłem też czoła temu problemowi i nie mogłem znaleźć żadnego rozwiązania w sieci.

Tak więc, jeśli skonfigurowałeś program nasłuchujący LongClick, widok Web przestałby pokazywać wybór. Po zagłębieniu się w kod Webview odkryłem, że wywołał on metodę WebView startRunMode i przekazał instancję klasy SelectActionCallbackMode.

po prostu przedłużony Webview klasę i overrided metodę startRunMode takiego:

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

To zmusiło Webview wyświetlać moje oddzwanianie zamiast wyświetlać domyślną Webview użytkownika. Zapewniło to, że wybór działał tak gładko, jak poprzednio, a moja CAB była wyświetlana za każdym razem, gdy dokonano selekcji. Jedynym zastrzeżeniem było to, że musiałem napisać kod, aby samemu usunąć CAB.

Testowany na urządzeniach 4.1, 4.2 i 4.3.

Mam nadzieję, że to pomoże.

+0

dziękuję, to działa dla mnie – mohitum

+0

Ale nie można uzyskać wybranego tekstu z widoku WWW. Ponadto w mojej implementacji czasami dostaję wewnętrzny błąd w webview KitKat, używając tego podejścia. – Frank

+0

@Frank Możesz pobrać zaznaczony tekst przez JavaScript (window.getSelection(). ToString()). Nie próbowałem tego jeszcze na KitKat, spróbuję spojrzeć na problem. –

1

Oficjalna dokumentacja Selection | Android Developers zauważa, że:

selekcji działań CAB

Można zdecydować, które pojawiają się działania i elementy w kabinie. Użyj instrukcji w pliku Action Bar pattern, aby zdecydować, które elementy mają zostać umieszczone na najwyższym poziomie i które mają zostać przeniesione do nadmiaru czynności.

dynamicznie zmieniać działania CAB W większości przypadków trzeba dostosować działania w kabinie dynamicznie użytkownik dodaje więcej przedmiotów do wyboru. Akcje mające zastosowanie do pojedynczego wybranego elementu danych o numerze niekoniecznie mają zastosowanie do wielu wybranych elementów danych tego samego rodzaju.

Niestety, link zawarty w cytacie prowadzi do sekcji, która zawiera tylko ogólne informacje bez wchodzenia w szczegóły. Co gorsza, łączy się ze stroną Selection | Android Developers.

Patrząc nieco dalej, odnalazłem this tutorial od Larsa Vogela. Cytuję (kopalnia formatowania):

kontekstowej tryb działania aktywuje tymczasowy ActionBar który zostanie nałożony aplikację ActionBar na czas trwania danego podzadania.

Tryb działania kontekstowego jest zwykle aktywowany przez wybranie elementu lub długie kliknięcie.

Aby zaimplementować tę metodę, zadzwoń pod numer startActionMode() w widoku lub na swoją aktywność pod numerem . Ta metoda pobiera obiekt ActionMode.Callback, który jest odpowiedzialny za cykl życia kontekstowego ActionBar.

Można również przypisać menu kontekstowe do metody View za pomocą metody registerForContextMenu(view). Menu kontekstowe jest również aktywowane , jeśli użytkownik "długo naciska" na widok. Metoda onCreateContextMenu() jest wywoływana za każdym razem, gdy menu kontekstowe jest aktywowane, ponieważ menu kontekstowe jest odrzucane po jego użyciu. Powinieneś preferować tryb kontekstowy w stosunku do używania menu kontekstowych.

Najważniejsze wzmianki wspominające, że możemy stworzyć własne menu za pomocą registerForContextMenu(view). Zamiast duplikowania odpowiedzi, znalazłem this answer przez J. Pablo Fernández, która zawiera przykład kodu, jak zastosować własną CAB. Zarejestrowanie nowego menu kontekstowego powinno zastąpić domyślne menu, ale nie jestem pewien.Ponieważ nie jestem w stanie przetestować tego w tej chwili, byłbym zadowolony usłyszawszy, czy to rozwiązało twój problem.