2016-05-25 40 views
8

Questo problema si verifica sui dispositivi Samsung con Android 6.0. Funziona bene su tutti gli altri dispositivi, compresi i dispositivi non Samsung con Android 6.0 e i dispositivi Samsung con Android 5.1 e versioni successive.textView.getSelectionEnd() restituisce il valore dell'indice iniziale sui dispositivi Samsung Marshmallow 6.0

Attualmente non abbiamo alcun dispositivo Samsung con Android 6.0 per controllare facilmente le cose su di esso, ma lo stiamo organizzando a breve.


La caratteristica in cui stiamo usando questo:

presse lunghi

L'utente su una parola da una frase in un TextView e quindi l'utente può modificare la parola selezionata.


Compiamo questo:

  • Rendere il selezionabile TextView e aggiungendo un LongClickListener.
  • Aggiunta di una modalità di selezione personalizzata CallBack e sovrascrittura di onCreateActionMode() per restituire false, poiché non è necessaria la modalità di azione predefinita copia-incolla-incolla.
  • Gestione di onLongClickListener per ottenere la parola esatta selezionata e fornire un'interfaccia utente per correggere e sostituire la parola.

Il problema che stiamo affrontando:

textView.getSelectionStart() restituisce l'indice di partenza corretto ma textView.getSelectionEnd() restituisce il valore di indice di partenza al posto dell'indice finale. Abbiamo una condizione di guardia che ogni volta che l'indice di inizio e di fine sono uguali, allora la selezione è per uno spazio e quindi ignoriamo, quindi tutte le selezioni di parole sui dispositivi Samsung con Android 6.0 e versioni successive vengono ignorate con conseguente malfunzionamento della funzione.


cose che abbiamo cercato:

  • Abbiamo cercato di sostituire la ActionMode.Callback con ActionMode.Callback2 come accennato nella sezione "Selezione testo" a pagina Android 6.0 Changes ma didn `t aiuto nel risolvere questo problema .
  • Provato a cercare qualsiasi impostazione extra di Samsung disponibile in relazione alla selezione del testo, agli appunti, ecc. Ma senza fortuna. So che questa può essere un'opzione zoppa, ma non mi prendo rischi con Samsung Touchwiz. Ho trovato un'impostazione per modificare il ritardo per la selezione del tocco da 0,5 a 2,0 secondi.

I frammenti di codice:

tvText.setCustomSelectionActionModeCallback(new ActionMode.Callback() { 
     @Override 
     public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
      return false; // true = create the ActionMode 
     } 

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

    tvText.setOnLongClickListener(new View.OnLongClickListener() { 

     @Override 
     public boolean onLongClick(View v) { 

      final TextView textView = (TextView) v; 
      new Handler().postDelayed(new Runnable() { 

       @Override 
       public void run() { 

        //This works correct on all devices with Android 6.0 
        int startIndex = textView.getSelectionStart(); 

        //This works wrong on Samsung devices with Android 6.0, result is same as getSelectionStart() 
        int endIndex = textView.getSelectionEnd(); 

        //The guard condition where we ignore the empty selections 
        if ((endIndex - startIndex) <= 0) { 
         return; 
        } 

        // Do bunch of things to UI like applying some different foreground colors to the selected word, striking out selected word etc. 
       } 
      }, TEXT_LONG_PRESS_DELAY); 
      return false; 
     } 
    }); 

Il codice XML per l'TextView e `s stile:

<TextView 
    android:id="@+id/tvText" 
    style="@style/StyleChatBubbleText" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginBottom="2dp"/> 

<style name="StyleChatBubbleText"> 
    <item name="android:layout_width">wrap_content</item> 
    <item name="android:layout_height">wrap_content</item> 
    <item name="android:textSize">16dp</item> 
    <item name="android:textColor">@color/text_black</item> 
    <item name="android:textIsSelectable">true</item> 
    <item name="typeface">roboto_regular</item> 


Qualsiasi aiuto per quanto riguarda questo problema è apprezzato .

risposta

1

controllare la versione di build se buildversion è> = 6 return true, implementare una barra degli strumenti mobile con il layout personalizzato. se buildversion < 6 return false, usa la tua attuale implementazione

+0

Hai passato correttamente la domanda? Innanzitutto, il problema non riguarda tutti i dispositivi Android 6.0. In secondo luogo, in entrambi i casi non è necessaria la barra di azione contestuale né la barra degli strumenti mobile. Le modifiche all'interfaccia utente richieste sono disponibili e curate. Il problema è con la chiamata API che restituisce risultati errati. – binaryKarmic

+0

sì, Samsung tende a personalizzare un po '. Quindi sarà meglio controllare con l'implementazione predefinita. Il problema è visto per i dispositivi Android 6 nei dispositivi Samsung, prova a utilizzare l'implementazione predefinita per i dispositivi Samsung. puoi personalizzare l'interfaccia utente della barra degli strumenti mobile in qualsiasi modo tu voglia. La possibile causa del problema potrebbe essere dovuta al fatto che la modalità Action non è stata creata insieme alla personalizzazione di Samsung. – NIPHIN

+0

Cosa intendi per implementazione predefinita? E il problema non è affatto la personalizzazione di qualsiasi barra degli strumenti mobile. In effetti non vogliamo alcuna barra degli strumenti mobile. Quello che vogliamo è textView.getSelectionEnd() restituendo il valore corretto. – binaryKarmic